当前位置:   article > 正文

License文件生成原理_软件license实现原理

软件license实现原理

License是什么

如果你有一个产品,希望有权限的用户才可以访问,此时发布一个许可证给用户,就能控制权限了。license是一种商业模式,用户通过购买产品软件,获取license就可以使用。

实现方案

license通过认证和鉴权实现管控,认证指识别用户身份信息,鉴权指校验用户具有哪些功能权限信息;

认证实现方式:可以分为离线和在线,对于在线认证的实现方案,实现一个登录方案,通过账号和密码验证合法即可;离线一般通过绑定软件的机器码或者发放一个序列号实现。

鉴权实现方式:对于用户拥有的权限或者相应功能等信息加密后存放license文件中,在产品软件加载时校验。鉴权实现方式通常使用可逆的加密算法,例如:RSA非对称算法,授权公钥,校验时通过私钥解密。

实现代码

简单实现案例如下:

  1. public class SecretTest {
  2. public static void main(String[] args) {
  3. KeyGenerater keyGenerater = new KeyGenerater();
  4. keyGenerater.generater();
  5. String plainText = "ASDFGHJklsghj%%@##$%^&";
  6. byte[] pubKey = keyGenerater.getPubKey();
  7. byte[] signText = Signaturer.sign(keyGenerater.getPriKey(), plainText);
  8. boolean isOk = SignProvider.verify(pubKey, plainText, signText);
  9. System.out.println(isOk);
  10. }
  11. private static final String ALGORITHM_RSA = "RSA";
  12. private static final String ALGORITHM_MD5_RSA = "MD5withRSA";
  13. static class SignProvider {
  14. private SignProvider(){
  15. }
  16. public static boolean verify(byte[] pubKeyText, String plainText, byte[] signText){
  17. try {
  18. // 解密由base64编码的公钥,并构造X509EncodedKeySpec对象
  19. X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(pubKeyText));
  20. // RSA 对称加密算法
  21. KeyFactory factory = KeyFactory.getInstance(ALGORITHM_RSA);
  22. // 取出公钥对象
  23. PublicKey pubKey = factory.generatePublic(bobPubKeySpec);
  24. // 解密base64 编码的数字签名
  25. byte[] signed = Base64.getDecoder().decode(signText);
  26. Signature signature = Signature.getInstance(ALGORITHM_MD5_RSA);
  27. signature.initVerify(pubKey);
  28. signature.update(plainText.getBytes());
  29. // 验证签名是否正常
  30. if(signature.verify(signed)){
  31. return true;
  32. }else{
  33. return false;
  34. }
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38. return false;
  39. }
  40. }
  41. static class Signaturer {
  42. public static byte[] sign(byte[] priKeyText, String plainText){
  43. try {
  44. PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(priKeyText));
  45. KeyFactory factory = KeyFactory.getInstance(ALGORITHM_RSA);
  46. PrivateKey prikey = factory.generatePrivate(priPKCS8);
  47. // 用私钥 对信息生成数字签名
  48. Signature signature = Signature.getInstance(ALGORITHM_MD5_RSA);
  49. signature.initSign(prikey);
  50. signature.update(plainText.getBytes());
  51. byte[] signed = Base64.getEncoder().encode(signature.sign());
  52. return signed;
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. }
  56. return null;
  57. }
  58. }
  59. /**
  60. * 生成公钥
  61. */
  62. static class KeyGenerater {
  63. private static final String RANDOM_STR = "www.baidu.com";
  64. private byte[] priKey;
  65. private byte[] pubKey;
  66. public void generater(){
  67. try {
  68. KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM_RSA);
  69. SecureRandom secrand = new SecureRandom();
  70. secrand.setSeed(RANDOM_STR.getBytes()); // 初始化随机产生器
  71. keyGen.initialize(1024, secrand);
  72. KeyPair keyPair = keyGen.genKeyPair();
  73. PublicKey pubkey = keyPair.getPublic();
  74. PrivateKey prikey = keyPair.getPrivate();
  75. pubKey = Base64.getEncoder().encode(pubkey.getEncoded());
  76. priKey = Base64.getEncoder().encode(prikey.getEncoded());
  77. System.out.println("pubKey = " + new String(pubKey));
  78. System.out.println("priKey = " + new String(priKey));
  79. } catch (NoSuchAlgorithmException e) {
  80. e.printStackTrace();
  81. }
  82. }
  83. public byte[] getPriKey(){
  84. return priKey;
  85. }
  86. public byte[] getPubKey(){
  87. return pubKey;
  88. }
  89. }
  90. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/663822
推荐阅读
  

闽ICP备14008679号