RSA实现JS前端加密与PHP后端解密功能示例
程序员文章站
2022-06-03 13:02:41
本文实例讲述了rsa实现js前端加密与php后端解密功能。分享给大家供大家参考,具体如下:
web前端,用户注册与登录,不能直接以明文形式提交用户密码,容易被截获,这时就...
本文实例讲述了rsa实现js前端加密与php后端解密功能。分享给大家供大家参考,具体如下:
web前端,用户注册与登录,不能直接以明文形式提交用户密码,容易被截获,这时就引入rsa。
前端加密
需引入4个js扩展文件,jsbn.js、prng4.js、rng.js和rsa.js。
<html> <head> <title>rsa login test</title> <meta charset="utf-8"> <script type="text/javascript" src="./js/jsbn.js"></script> <script type="text/javascript" src="./js/prng4.js"></script> <script type="text/javascript" src="./js/rng.js"></script> <script type="text/javascript" src="./js/rsa.js"></script> <script src="//cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script> <script type="text/javascript"> function cmdencrypt() { var passwd = $('#passwd').val(); var rsa = new rsakey(); //openssl生成的modulus,十六进制数据 var modulus = "db1ea572b55f5d9c8adf092f5dcc3559cfea8ce8bb54e3a71da9b1afbd7d17cf80adb224fe4ea5379bc782f41c137748d8f1b5a36ad62a127ef5e87efb25c209a66bcee9925ce09631bf2271e81123e93438646625080ff04f4f2cf532b077e3e390486df40e7586f0ae522c873f33170222f46bdb6084f55de6b7031e55dbe7"; //openssl生成秘钥时的e的值(0x10001) var exponent = "10001"; rsa.setpublic(modulus, exponent); var res = rsa.encrypt(passwd); $('#passwd').val(res); } </script> </head> <body> <form action="./login.php" method="post" > <label for="username">用户名:</label><input type="text" name="username" id="username"> <label for="passwd">密 码:</label><input type="password" name="password" id="passwd"> <input type="submit" value="登录" onclick="cmdencrypt();"> </form> </body> </html>
前端代码十分简单,只有短短的几行,下面分别解释具体的含义:
- 1.
new
一个rsakey对象, - 2.定义modulus(模数),我们可以根据私钥计算出该值(十六进制),具体指令:
rsa -in rsa_private_key.pem -noout -modulus
- 3.定义exponent,此值在openssl生成秘钥时,输出,一般情况下e的取值是一个定值10001(十六进制)
- 4.设置公钥
- 5.加密数据
至此,我们就完成了前端的公钥加密。
后端解密
//私钥 $private_key = "-----begin rsa private key----- miicxaibaakbgqdicrxl+elhqfe0xcga3/xdn1vxwuc5kxakb5f3f28hy40zdxbn uwpdqnknhwtnvhzupbrhlypqx+1plti81sradtyknwvolrlwwp3mziyrrvo0hf3c vxn33r4a5y1yuh+txvfgikbmmnsjp4pp3cizc0tedmt1+h17cv6s6kddoqidaqab aogadu2/nqkdikvcc7+dn65yycyklovw34jqsxom++8nqfnsucktpzn60hraipet fu/l7x2jpqhp9+wuf1puyvjazqb5e9n8g12nxdubs5ux085inowp69pxnsljhyip mprgpf7zsgglftvxlg+hrufzxj26nqekwn61mi+cjmsmt/ecqqdpg868peijed/g pumtt7grgdadmpj0+aln82zsfa84zda8po9erefxrm2mar/fuvxl/vc0fbrygaa/ vainkj6takea203jdovtnfg87znl9z0/z3kuxcmry+7m28+7btf1eadzxjwvfwtx cv4ejhjdn6clht6atuamw0snlta9n4cgpqjasbltxitubhv5u5htniq5thwzrzoy yldfpo7zi89on+a7yg4cebyi/ft9z6ysh7cvk1rg6wqfuyn4a3wj0ldlzqjbaijr pq0trbll25toxtaiki9jreduuga/mc1gu+albdhc+htzaxpvy0rlj2hgf9l6nf1d sw4rewqssfbnkcrkc+0cqclxcpv2wwsgmfhltqpkeyspievy4nrthv8zeyvm7muu gvlsj6sqvcuuqbvholrpqqidi8tpaemhzs9fhdjvuuc= -----end rsa private key-----"; $hex_encrypt_data = trim($_post['password']); //十六进制数据 $encrypt_data = pack("h*", $hex_encrypt_data); //对十六进制数据进行转换 openssl_private_decrypt($encrypt_data, $decrypt_data, $private_key); //解密数据 echo '解密后的数据:' . $decrypt_data;
openssl操作截图:
需要注意的是:前端加密的时候如果是中文,则解密后是乱码。
openssl工具和完整demo,详见:https://github.com/cqingt/rsa_js_php
ps:关于加密解密感兴趣的朋友还可以参考本站在线工具:
在线rsa加密/解密工具:
文字在线加密解密工具(包含aes、des、rc4等):
在线散列/哈希算法加密工具:
在线md5/hash/sha-1/sha-2/sha-256/sha-512/sha-3/ripemd-160加密工具:
在线sha1/sha224/sha256/sha384/sha512加密工具:
上一篇: 直接拿来用!十大Material Design开源项目
下一篇: C# partial关键字说明