目前一般帐号系统,都是https来传输账户性息,申请一个https证书也不贵。但是网站的其它功能并不需要走https协议,https和http混布比较麻烦,所以决定先实现一个http协议传输RSA非对称密钥算法加密密码的方案。这样做只能说是保证不明文传密码,但是并不能防身份伪造,所以其实还是不安全的,只是目前产品能接受,算是一个过渡期吧。有需要的话还是要改成https的。

关于rsa算法,具体参考维基百科相关的介绍。简单来说,用rsa算法产生一对公钥和私钥,通信双方A和B,A用公钥加密要发送的数据,B用私钥来解密A发过来的密文,从而获得a想要发过来的数据。保证rsa密文不容易被破解的理论依据是对极大整数做因数分解的难度非常大。

下面具体看看实现过程。这里前端用到rsa的js实现方案jsencrpt.js ,后端用php的open_pkey_new等相关方法。

1.【后端】先看php生成公钥密钥对相关代码:

function generatePubPri() {
$config = array("config" => '/path/to/openssl.cnf');
$res = openssl_pkey_new($config);
openssl_pkey_export($res,$pri, null, $config);
$d= openssl_pkey_get_details($res);
$pub = $d['key']; $pubFd = fopen("pub.txt", "w");
fwrite($pubFd, $pub);
fclose($pubFd); $priFd = fopen("pri.txt", "w");
fwrite($priFd, $pri);
fclose($priFd);
}

这里前提是要安装openssl,php要加载openssl扩展。执行generatePubPri即可的到如下的公钥密钥对,每次执行生成的都不一样。

[xxx@xxx makedemo]$ cat pri.txt
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCq/8HruBYhems80BluLiiP0uUTzM/NJSFktzxA1rfzjhEg8z0W
r0WAvIdbye2vTG0CYi6PGpjxgUkEVaaHLWEIMiA4g3TIFSUp5pmlWRpGNqilrxd4
sXM5wzL13WkN1j6gBfZNJt62mO35A2Ubl9fbNw/YU2KNPR0+EHP0Z6agmwIDAQAB
AoGAViPcllf3ngnDN7FE/kH2YO1GRMEp9Re9SLUdfzQrGl/4tPaTUXgdtQpDzbNd
Lq97QnYfKiul3BLaq3pSF0p+1AUHtJby/HT1Tqz0380x9Y+QKjJErePycTs28zIq
FXmCMnOqxhaWPB89hxCIG0g7bVt9qGRDUZGY05kMwSM9gvECQQDcWjQoBfb4IQls
RUQlprzizQD+S4cHJdxCq5qh7TqyH1IPoHq04tQsuYFVEH2+Z0Spimz/oluNuDnJ
NppKdJZdAkEAxqmbtzs9bPbyihb9qpsD8Sne1DIo5uRBJ7G4/RE4vazaAXX9HUIS
HZg/To5XSGHzgQteIUXJRjpX5sYLCS8zVwJAQxElbMUb/Tu47X5LlpYgSXuSANQm
HfPVDWnDn+NfiRVlWaJDlsivQYmYprZlP02ZJW0fbdMRwJnA5NA8t8qydQJBAKZH
dERLW0CG+b7HO46+rPAAAbhOO5n2VuqogJOhBIMN2HL8lN0WXh9TPTm9PiUhhzTt
lN34kV0snEJWZQpM7YUCQQCgKhoAlp4DpcYvqq569UI7IE4ZL4l9RlkiNG1UYyda
iZoNVN7ji8K2ZvOKykJBwDeKIn4JrknUHrjZXEweRKEl
-----END RSA PRIVATE KEY-----
[xxx@xxx makedemo]$ cat pub.txt
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq/8HruBYhems80BluLiiP0uUT
zM/NJSFktzxA1rfzjhEg8z0Wr0WAvIdbye2vTG0CYi6PGpjxgUkEVaaHLWEIMiA4
g3TIFSUp5pmlWRpGNqilrxd4sXM5wzL13WkN1j6gBfZNJt62mO35A2Ubl9fbNw/Y
U2KNPR0+EHP0Z6agmwIDAQAB
-----END PUBLIC KEY-----

2.【前端】用公钥加密一下密码"123456"。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JS->jsencrypt.js RSA加密实现</title>
<script type="text/javascript" src="jsencrypt.js"></script>
</head>
<body>
<script type="text/javascript">
var crypt = new JSEncrypt(); //新建rsa对象
var publickey = '\
-----BEGIN PUBLIC KEY-----\
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq/8HruBYhems80BluLiiP0uUT\
zM/NJSFktzxA1rfzjhEg8z0Wr0WAvIdbye2vTG0CYi6PGpjxgUkEVaaHLWEIMiA4\
g3TIFSUp5pmlWRpGNqilrxd4sXM5wzL13WkN1j6gBfZNJt62mO35A2Ubl9fbNw/Y\
U2KNPR0+EHP0Z6agmwIDAQAB\
-----END PUBLIC KEY-----\
';
crypt.setPublicKey(publickey);//添加来自服务端的publickey
var result = crypt.encrypt('123456'); //返回值为加密后的结果
console.log(result);
</script>
</body>
</html>

在浏览器里访问后,控制台会打印出如下的加密字符串:

SonHPbJpQBwygjZ5ZMtybfLEylnNCsd3poBsNxSt3QkUSDe+Pf7lf4JJIot9Ybd7mAXiOUgGZR7VctCSJhzzZQWNZp1or6h6dsYoFHE/dbDHIxJGcXMNfv5BqrfAMGqkQVvyrED3NHcrgXokataRJOrsU7yvKpQKW6e3j+zcZD8=
eRA40/RbbbqtuEC10Ee3NVDsnpfgibn8nRuTaPmvXI1XjVFX8pjwtMxiuT9xaBfX8K+LI/6ccgghYyJdxjd8V+DyxBPz6/QzT3f5eoOz9ULD85r0K//BuKvuTiyQ/NajProvPN3ns6UzxECmuFg0UNtrMNkOdFRpaAtueadKJDU=
Tqgagyx5DlDLI/tcxYsnN/3AbUPCX/EFE6yn5SoVMX3R/RQ6od6b4hT10LUctcBZ649RhHkwzxTFzIFfvbRS87OftOhebGXAP9JpN/xt9IsaXOU4wp8ZiyQKIrClnepXtRaSC10WF/ishsejgo3i7APXs7fWJiEMkoqRYwnbyPo=

。。。。。。奇怪的是每次刷新打印的都不一样。估计都可以用的。

3. 【后端】解密前端发送过来的密文

解密的方法:

/**
* rsa解密
* @access public
* @param 密文
* @return 解密后的字符串
*/
function decrypt($data, $privkey) {
if (openssl_private_decrypt(base64_decode($data), $decrypted, $privkey)){
$data = $decrypted;
}else {
$data = '';
}
return $data;
}

$priveKey = file_get_contents("pri.txt");
$data = "SonHPbJpQBwygjZ5ZMtybfLEylnNCsd3poBsNxSt3QkUSDe+Pf7lf4JJIot9Ybd7mAXiOUgGZR7VctCSJhzzZQWNZp1or6h6dsYoFHE/dbDHIxJGcXMNfv5BqrfAMGqkQVvyrED3NHcrgXokataRJOrsU7yvKpQKW6e3j+zcZD8=";
echo decrypt($data, $priveKey);
echo "\n";

最后是解密出"123456"

[xxx@xxx makedemo]$ php rsa.php
123456

试了一下另外两个密文,非常棒,发现也是可以解出"123456"。

最后给一个完整的demo,流程如下:

代码如下:

1.submitPassword.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JS->jsencrypt.js RSA加解密实现</title>
<script type="text/javascript" src="jsencrypt.js"></script>
<script type="text/javascript" src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
</head>
<body>
<script type="text/javascript">
var PassWord = "123456";
function myEncrypt(pass) {
var crypt = new JSEncrypt();
var publickey = "";
crypt.setPublicKey(publickey);
return crypt.encrypt(pass);
}
var promise = $.ajax({
url: "getPublicKey.php",
method: "POST",
dataType: "json",
data: {}
});
promise.done(function(data){
if(data.code === 0) {
var passWord = myEncrypt(PassWord);
var passPromise = $.ajax({
url: "recievePassword.php",
method: "POST",
dataType: "json",
data: {"password": passWord}
});
passPromise.done(function(data){
if(data.code === 0) {
console.log("submit success.");
}else{
console.log("submit failed.");
}
});
passPromise.fail(function(err){
console.log(err);
});
}else {
console.log("submit failed.");
}
});
promise.fail(function(err){
console.log(err);
}); </script>

2.getPublicKey.php

function generatePubPri() {
$config = array("config" => '/home/users/zhutianpeng/.jumbo/etc/ssl/openssl.cnf');
$res = openssl_pkey_new($config);
openssl_pkey_export($res,$pri, null, $config);
$d= openssl_pkey_get_details($res);
$pub = $d['key']; $pubFd = fopen("pub.txt", "w");
fwrite($pubFd, $pub);
fclose($pubFd); $priFd = fopen("pri.txt", "w");
fwrite($priFd, $pri);
fclose($priFd); return $pub;
} $publicKey = generatePubPri();
$data = array("code" => 0,
"msg" => "success",
"data" => array("pubkey" => $publicKey));
echo json_encode($data);

3.recievePassword.php

$passWord = $_POST['password'];
$ret = array();
if(!empty($passWord)) {
$ret['code'] = 0;
$ret['msg'] = "success";
}else {
$ret['code'] = 1;
$ret['msg'] = "not recieved a password";
}
echo json_encode($ret);

[完]

RSA非对称算法实现HTTP密码加密传输的更多相关文章

  1. 用RSA加密实现Web登录密码加密传输

    通常我们做一个Web应用程序的时候都需要登录,登录就要输入用户名和登录密码,并且,用户名和登录密码都是明文传输的,这样就有可能在中途被别人拦截,尤其是在网吧等场合. 这里顺带一个小插曲,我以前有家公司 ...

  2. 基于RSA的前后端登陆密码加密JAVA实现(转)

    RSA加密算法简介 SA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用.对极大整数做因数分解的难度决定了RSA算法的可靠性.换言之,对一极大整数做因数分解愈困难,RSA算法愈 ...

  3. RSA非对称算法(转)

    RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解.我们经 ...

  4. 记一次RSA非对称算法的排坑经历

    Map<String,Object> encryParam = new HashMap<>(5); encryParam.put("connectorUrl" ...

  5. 编写高质量代码改善C#程序的157个建议——建议116:避免用非对称算法加密文件

    建议116:避免用非对称算法加密文件 MD5值或者说HASH值是一种不可逆的算法.如果需要从密文还原成明文,那么就需要对称和非对称这两类可逆算法了. 对称算法示意图: 在对称算法中,首先需要发送方和接 ...

  6. web登录密码加密

    文章:如何实现登录页面密码加密 文章:用RSA加密实现Web登录密码加密传输 文章:web登录用户名密码加密 知乎文章:Web前端密码加密是否有意义? 文章:记录一次黑客模拟攻击 成功拿到淘宝账号和密 ...

  7. js中变量base64加密传输

    首先对base64进行定义: var Base64 = { _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01 ...

  8. 用RSA实现Web单点登录密码的加密传输

    在使用通用权限管理系统(吉日嘎拉)的单点登录功能时,对登录密码使用了RSA加密(非对称加密),有使用这个权限管理系统的可参考下. 前端部分,请引用以下几个js文件: <script type=& ...

  9. 前后端数据加密传输 RSA非对称加密

    任务需求:要求登陆时将密码加密之后再进行传输到后端. 经过半天查询摸索折腾,于是有了如下成果: 加密方式:RSA非对称加密.实现方式:公钥加密,私钥解密.研究进度:javascript与java端皆已 ...

随机推荐

  1. 微信小程序 报警告的解决办法

    wx:for   如果没有给它相应的  wx:key 控制台就会有警告,解决的办法给它添加相应的key警告就消失啦

  2. PowerDesigner常用快捷键

    一般快捷键 F4   打开检查模型窗口,检查模型 F5   如果图窗口内的图改变过大小,恢复为原有大小即正常大小 F6   放大图窗口内的图 F7   缩小图窗口内的图 F8   在图窗口内中查看全部 ...

  3. 【CF778C】Peterson Polyglot(Trie树,启发式合并)

    题意:有一棵n个结点的只由小写字母组成的Trie树,给定它的具体形态,问删除哪一层后剩下Trie树的结点数最少 n<=3e5 思路:先建出原Trie树,对于每一层的每一个结点计算删除后对答案的贡 ...

  4. sublime 常用快捷键备忘

    转一篇sublime常用的快捷键备忘 sublime常用快捷键 选择类Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本.Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本 ...

  5. check source code after macro expand

    Some time I'd like check source code after macro expand. We can use -E option to stop after the prep ...

  6. 牛客网 牛客练习赛13 C.幸运数字Ⅲ-思维

    C.幸运数字Ⅲ   链接:https://www.nowcoder.com/acm/contest/70/C来源:牛客网     这个题447和477是特殊的,其他的就没什么了.   代码: 1 #i ...

  7. 牛客网 牛客小白月赛1 D.多项式乘法

    D.多项式乘法   链接:https://www.nowcoder.com/acm/contest/85/D来源:牛客网 这个题想一下就能想出来了. 代码: 1 #include<iostrea ...

  8. LoadRunner安装破解

    安装过程 1. 运行“setup.exe” 点击安装,其中会有提示缺少“Microsoft Visual C++ 2005 SP1等运行组件”,下载这些组件.这里安装“vcredist_x86.exe ...

  9. 10.1综合强化刷题 Day2 afternoon

    最大值(max) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目: 这里有一个长度为n的 ...

  10. POJ 2484 A Funny Game [博弈]

    题意:n枚硬币围成一个圈,每次每个人可以从中取走一枚或者相邻的两枚(如果两枚硬币原本中间隔着一枚硬币,后来被取走,这两枚硬币不算相邻).谁取走最后一枚硬币谁就赢了. 思路:我们可以找找规律. 首先,n ...