最近项目中有对密码加密的需求,就了解了一下非对称加密
对于非对称加密,最常用的就是RSA和DSA,
非对称加密有公钥和私钥两个概念,私钥自己拥有,不能给别人,公钥公开。根据应用的不同,可以使用不同的密钥加密:
- 签名:使用私钥加密,公钥解密。用于让所有公钥所有者验证私钥所有者的身份并且用来防止私钥所有者发布的内容被篡改,但是不用来保证内容不被他人获得。
- 加密:用公钥加密,私钥解密。用于向公钥所有者发布信息,这个信息可能被他人篡改,但是无法被他人获得。
RSA算法
RSA是最流行的非对称加密算法之一。也被称为公钥加密。它是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA是非对称的,也就是用来加密的密钥和用来解密的密钥不是同一个。和DES一样的是,RSA也是分组加密算法,不同的是分组大小可以根据密钥的大小而改变。如果加密的数据不是分组大小的整数倍,则会根据具体的应用方式增加额外的填充位。
RSA加密
在hutool工具中,有现成的方法使用;
首先需要引入依赖:
compile 'cn.hutool:hutool-crypto:5.8.9'
- 生成密钥对:
调用rsa()方法生成随机的公钥和私钥;
伪代码如下:
RSA rsa_o = SecureUtil.rsa();
String priKey = rsa_o.getPrivateKeyBase64();
String pubKey = rsa_o.getPublicKeyBase64();
- 加密字符串
使用公钥加密字符串
伪代码如下:
RSA rsa = SecureUtil.rsa(null, pubKey);
String base64 = rsa.encryptBase64("123456", StandardCharsets.UTF_8, KeyType.PublicKey);
System.out.println(base64);
- 解密字符串
使用私钥解密字符串:
伪代码如下:
rsa = SecureUtil.rsa(priKey,null);
base64 = rsa.decryptStr(base64,KeyType.PrivateKey);
System.out.println(base64);
项目应用
在项目应用中,可以对在启动类中对密码进行加密;
伪代码如下:
public class GzApplication {
public static void main(String[] args) {
if(args.length >= 2){
encryptPwd(args[0],args[1]);
return;
}
SpringApplication.run(GzApplication.class, args);
}
public static String encryptPwd(String pwd,String pubKey){
RSA rsa = SecureUtil.rsa(null, pubKey);
String base64 = rsa.encryptBase64(pwd, StandardCharsets.UTF_8, KeyType.PublicKey);
String encryptPwd = new StringBuffer("RSA:").append(base64).toString();
return encryptPwd;
}
打包完成后,使用java -jar **.jar pwd pubkey命令,输出加密后的字符串;