作者:风雪漫天2702934714_713 | 来源:互联网 | 2023-05-18 04:49
淘宝,购物者的天堂。每天更有数以万计的用户登陆购买商品,其背后的技术支持,能让我们愉快的购物。而前段时间吵得很火的,数据包劫持能够分析到你的各种行为,其中不乏网站账号密码。而为什么他们
淘宝,购物者的天堂。每天更有数以万计的用户登陆购买商品,其背后的技术支持,能让我们愉快的购物。
而前段时间吵得很火的,数据包劫持能够分析到你的各种行为,其中不乏网站账号密码。而为什么他们没有劫持到淘宝的账号密码呢,总是拿别的小软件开涮呢?原因很简单,淘宝的密码在页面传输之前就进行了rsa加密(一种非对称的算法),传输的时候已经变为了已加密的密码了,就算你截取后,没有私有密钥也是解不开的,而且每次rsa加密后都会得到的不同密文,so,这既是为什么没人调戏淘宝的原因。
讲了这么多,先讲讲我是怎么找到加密算法那段代码的吧,适用于新手。
一、寻找rsa加密模块
用火狐浏览器,然后加firebug插件
选择属性改变时暂停
此时的password2也就是加密后密文
- 正常登录
输入账号密码后提交,此时浏览器会暂停起来。
一直F11,直接看到右边视图,然后点击右边第一行,再到左边点击箭头所选位置(JS格式化)。
再点F11, 就调到了RSA加密模块了。
在进入加密模块前,可以看到加密模块的调用信息:
encrypt: function (a) {
return a && this.pbk
&& this.exponent ? (this.rsa || (this.rsa = new e, this.rsa.setPublic(this.pbk, this.exponent)), a = this.rsa.encrypt(a)) : a
}
OK,我们分析完他的调用方法后,再看它的加密具体实现
地址在这里https://g.alicdn.com/kg/??rsa/2.0.1/index-min.js?t=1358514278.js
二、分析加密算法
打开我们找到的rsa加密模块地址,每一段开头都有这样一段代码
KISSY.add('kg/rsa/2.0.1/index', [
'./jsbn',
'./rng'
]
其实不然,通过对kissy(淘宝js框架)的简单了解,大概意思应该是在kissy中添加一个模块,这个模块的地址为“kg/rsa/2.0.1/index”,其中会用到另外2个模块 ‘./jsbn’, ‘./rng’。
插一句题外话,kissy框架,提出模块化的概念,所以很多的方法都包装到模块里面了,在你使用的时候,你只需要因为对应的模块即可。有种插件式开发的感觉,对于经常写程序开发的人来讲,比较熟悉也很容易接受。
这一步分析透彻后,我们需要做的是,去kissy模块化,这样才能把这个加密算法搬到你自己的论坛呀、站点呀这些地方。
KISSY.add('kg/rsa/2.0.1/index', [
'./jsbn',
'./rng'
],function (S, require, exports, module){
var index=function() {=
全文有4个模块需要改动。
我们再把引入的模块修改一下
var d = require('./jsbn'),
f = require('./rng');
var d = new jsbn();
f = new rng();
module.exports = i;
return i;
修改完后就可以写调用方法了
function encrypt(str){
var temp=new index();
temp.prototype.setPublic(this.pbk,this.exponent);
return temp.prototype.encrypt(str);
}
贴上我修改后的rsa地址,方便各位学习
http://download.csdn.net/detail/u014577133/9575570
写在最后,rsa算法其实网上到处都有一大片,包括java版,.net版等等。我这里只是分享下我的心得体会,顺便熟悉下浏览器的调试模式,下断点的方式。
我的疑问:
淘宝的C端采用rsa对密码进行加密,那么服务器端肯定有私钥来进行解密。这个过程中我的密码是”123”,加密后传输到服务器,解密后密码为”123”,然后和数据库里面我的密码进行比对。那是不是数据库里面我的密码存储的就是明码”123”呢?如果真有一天淘宝数据库泄密,成万上亿的用户密码被泄露,这个损失肯定相当严重!
不过有可能服务器端又进行二次加密,比如md5加密,然后再和数据库中已经进行了md5加密的密码进行比较,这样就算泄露,也不会让普通人随随便便就登录。能起到一定的作用。那服务器如果还要进行md5加密的话,那每天那么多的并发量,服务器还要进行二次加密是不是就增加了服务器的负担,那又为何不直接在客户端进行加密后再传输呢?答案不得而知,我猜测也许是为了兼容部分老系统吧,所以才到服务端进行二次加密。