首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
其他好文
> 详细
license文件生成原理
时间:
2015-02-02 15:33:26
阅读:
2590
评论:
0
收藏:
0
[点我收藏+]
标签:
byte
解密
weblogic
加密
oracle
hex
现在很多J2EE应用都采用一个
license文件来授权系统的使用,特别是在系统购买的早期,会提供有限制的
license文件对系统进行限制,比如试用版有譬如IP、日期、最大用户数量的限制等。
而
license控制的方法又有很多,目前比较流行,只要设计的好就很难破解的方法就是采用一对密匙(私匙加密公匙解密)来生成
License文件中的Sinature签名内容,再通过Base64或Hex来进行编码。比如原BEA公司现在是Oracle公司的WebLogic就采用的是这种方法来设置
License文件。
这里只进行一个比较简单的实现:
一共三个类:
A.KeyGenerater类生成公钥私钥对
B.Signaturer类使用私钥进行签名
C.SignProvider类用公钥验证
公钥和私钥使用Base64加密Base64这个类很多地方都可以查到。
KeyGenerater类:
public
class KeyGenerater {
private
byte[] priKey;
private
byte[] pubKey;
public
void generater() {
try {
KeyPairGenerator keygen = KeyPairGenerator .getInstance(
"RSA");
SecureRandom secrand =
new SecureRandom();
secrand.setSeed(
"www.川江号子.cn".getBytes());
// 初始化随机产生器
keygen.initialize(
1024, secrand);
KeyPair keys = keygen.genKeyPair();
PublicKey pubkey = keys.getPublic();
PrivateKey prikey = keys.getPrivate()
pubKey = Base64.encodeToByte(pubkey.getEncoded());
priKey = Base64.encodeToByte(prikey.getEncoded());
System.out.println(
"pubKey = " +
new String(pubKey));
System.out.println(
"priKey = " +
new String(priKey));
}
catch (java.lang.Exception e) {
System.out.println(
"生成密钥对失败");
e.printStackTrace();
}
}
public
byte[] getPriKey() {
return priKey;
}
public
byte[] getPubKey() {
return pubKey;
}
}
Signaturer 类:
public
class Signaturer {
public
static
byte[] sign(
byte[] priKeyText, String plainText) {
try {
PKCS8EncodedKeySpec priPKCS8 =
new PKCS8EncodedKeySpec(Base64.decode(priKeyText));
KeyFactory keyf = KeyFactory.getInstance(
"RSA");
PrivateKey prikey = keyf.generatePrivate(priPKCS8);
// 用私钥对信息生成数字签名
Signature signet = java.security.Signature.getInstance(
"MD5withRSA");
signet.initSign(prikey);
signet.update(plainText.getBytes());
byte[] signed = Base64.encodeToByte(signet.sign());
return signed;
}
catch (java.lang.Exception e) {
System.out.println(
"签名失败");
e.printStackTrace();
}
return
null;
}
}
SignProvider 类:
public
class SignProvider {
private SignProvider() {
}
public
static
boolean verify(
byte[] pubKeyText, String plainText,
byte[] signText) {
try {
// 解密由base64编码的公钥,并构造X509EncodedKeySpec对象
X509EncodedKeySpec bobPubKeySpec =
new X509EncodedKeySpec(Base64.decode(pubKeyText));
// RSA对称加密算法
KeyFactory keyFactory = KeyFactory.getInstance(
"RSA");
// 取公钥匙对象
PublicKey pubKey = keyFactory.generatePublic(bobPubKeySpec);
// 解密由base64编码的数字签名
byte[] signed = Base64.decode(signText);
Signature signatureChecker = Signature.getInstance(
"MD5withRSA");
signatureChecker.initVerify(pubKey);
signatureChecker.update(plainText.getBytes());
// 验证签名是否正常
if (signatureChecker.verify(signed))
return
true;
else
return
false;
}
catch (Throwable e) {
System.out.println(
"校验签名失败");
e.printStackTrace();
return
false;
}
}
}
license文件生成原理
标签:
原文地址:http://www.cnblogs.com/lvdongjie/p/4267629.html
踩
(
2
)
赞
(
1
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
分布式事务
2021-07-29
OpenStack云平台命令行登录账户
2021-07-29
getLastRowNum()与getLastCellNum()/getPhysicalNumberOfRows()与getPhysicalNumberOfCells()
2021-07-29
【K8s概念】CSI 卷克隆
2021-07-29
vue3.0使用ant-design-vue进行按需加载原来这么简单
2021-07-29
stack栈
2021-07-29
抽奖动画 - 大转盘抽奖
2021-07-29
PPT写作技巧
2021-07-29
003-核心技术-IO模型-NIO-基于NIO群聊示例
2021-07-29
Bootstrap组件2
2021-07-29
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!