RSA 非对称公私钥加密前端应用
1.项目应用场景:
项目中涉及到保密,敏感信息为了提高信息安全一般都会进行加密处理。今天项目经理要求将cms后台管理系统中密码用RSA加密
2. 涉及到的文档及说明
非对称加密,加密与解密使用的密钥不是同一密钥,
对中一个对外公开,称为公钥,
另一个只有所有者知道,称为私钥。
用公钥加密的信息只有私钥才能解开,反之,用私钥加密的信息只有公钥才能解开(签名验签)。
代表:RSA算法。速度慢,适合少量数据加密。对称加密算法不能实现签名,因此签名只能非对称算法
3. 代码
<!DOCTYPE html>
<html>
<head>
<title>RSA 非对称公私钥加密前端应用 </title>
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script src="http://passport.cnblogs.com/scripts/jsencrypt.min.js"></script>
<!--注 如果需要此文件直接访问 粘贴下来就可以 -->
<script type="text/javascript">
$(function () {
$("#testme").click(function () {
var encrypt = new JSEncrypt();
encrypt.setPublicKey($("#pubkey").val()); //设置公钥
//此处设断点检查问题 AA
var decrypt = new JSEncrypt();
decrypt.setPrivateKey($("#privkey").val()); // 设置私钥
var uncrypted = decrypt.decrypt(encrypted); //解密加密串
// 检测是否解密成功
if (uncrypted == $("#input").val()) {
alert("解密成功");
} else {
alert("有问题,不能解析");
}
});
});
</script>
</head>
<body>
<label for="privkey">私钥</label><br />
<!-- 此处是你要检测的私钥串 -->
<textarea id="privkey" rows="15" cols="65">
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ
WMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNR
aY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB
AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fv
xTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeH
m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd
8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu+cdrQeaqEixrCejXdAF
z/7+BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0/mPwmP5
rN7QwjrMY+0+AbXcm8mRQyQ1+IGEembsdwJBAN6az8Rv7QnD/YBvi52POIlRSSIM
V7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATe
aTgjFnqE/lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5Azil
psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU/YgDnSpJVm1nASoRUnU8Jfm3Oz
uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
-----END RSA PRIVATE KEY-----</textarea
><br />
<label for="pubkey">公钥</label><br />
<!-- 此处是你要检测的公钥串 -->
<textarea id="pubkey" rows="15" cols="65">
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr/L5i2osbl8C9 +WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNRaY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB
-----END PUBLIC KEY-----</textarea
><br />
<label for="input">输入的文本:</label><br />
<textarea id="input" name="input" type="text" rows="4" cols="70">
This is a test!</textarea
><br />
<input id="testme" type="button" value="Test Me!!!" /><br />
</body>
</html>
5. 注意事项
- 有一种情况是,前端在进行加密处理的时候,AA 设置公钥之后encrypt 是false
分析原因:这一步其实还没有涉及到公钥的正确性,所以设置的过程中,encrypt 对象属性中
此处e为0,bigInterger对象是空说明未设置公钥成功,这样就会显示false
检查一下你加载的jsencrypt.min.js 是否与其他项有冲突,我是因为项目中加载的base64.js有影响
正常的话是可以看到设置公钥之后的对象串