4.示例 (公钥加密,私钥解密)
通过公钥字符串 获取PublicKey对象
byte[] buffer = Base64Utils.decode(publicKeyStr)
KeyFactory keyFactory = KeyFactory.getInstance("RSA")
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer)
RSAPublicKey publicKey = (RSAPublicKey) RSAPublicKey.generatePublic(keySpec)
复制代码
使用publickey加密数据
Cipher cipher = Cipher.getInstance("转换")
// 编码前设定编码方式及密钥
cipher.init(Cipher.ENCRYPT_MODE, publicKey)
// 传入编码数据并返回编码结果
byte[] encrptData = cipher.doFinal(data)
复制代码
几个关键参数介绍:
1.转换 是一个字符串,它描述为产生某种输出而在给定的输入上执行的操作(或一组操作);
形式可以是
算法/模式/填充
或
算法
;
常见的模式如下:
RSA
(如果你的明文不够128字节加密的时候会在你的明文前面,前向的填充零。解密后的明文也会包括前面填充的零,这是服务器需要注意把解密后的字段前向填充的零去掉,才是真正之前加密的明文。)
RSA/ECB/PKCS1Padding
(加密的时候会在你的明文中随机填充一些数据,所以会导致对同样的明文每次加密后的结果都不一样)
RSA/None/PKCS1Padding
第一个 RSA 等价于 RSA/None/NoPadding .使用此模式加密后 同一个明文、同一个公钥每次生成同一个密文.攻击者能够据此识别到同一个信息都是何时被发送。
所以一般使用第二个 RSA/ECB/PKCS1Padding .
2.编码方式设定
cipher.init(MODE, publicKey);
常见编码方式 (MODE):
ENCRYPT_MODE: Cipher 初始化为加密模式的常量 (常用)
DECRYPT_MODE: Cipher 初始化为解密模式的常量 (常用)
WRAP_MODE :Cipher 初始化为密钥包装模式的常量
UNWRAP_MODE :Cipher 初始化为密钥解包模式的常量
PUBLIC_KEY :解包的密钥为“公钥”的常量
PRIVATE_KEY : 解包的密钥为“私钥”的常量
SECRET_KEY :解包的密钥为“秘密密钥”的常量
5.开发过程中容易遇到的坑
1.客户端需要与后端确认好使用同一转换模式 做到一一对应. 如果后端(java使用 RSA),则前端 需要使用(RSA/ECB/PKCS1Padding) 而不是 RSA.
2.前端请求下来的公钥字符串如果 包含 "-----BEGIN PUBLIC KEY-----" 和 "-----END PUBLIC KEY-----",需要将其切掉,如果直接使用 会报 InvalidKeySpecException .
-
687
-
margin_100px
JavaScript
-
434
-
萌萌哒草头将军
React.js
JavaScript
-
1500
-
youth君
Vue.js
Element
-
2370
-
我不是外星人
JavaScript
React.js