最新消息:

《解开人人网登录密码的 RSA 加密》学习

安全知识 admin 3868浏览 0评论

看到一篇文章《解开人人网登录密码的 RSA 加密》,文章中提到人人网为了避免密码的明文传输,使用了纯javascript实现的RSA库来对用户的密码进行加密传输。该javascript实现的RSA库的主页是:http://www.ohdave.com/rsa/。人人网使用此RSA库的加密传输过程如下:

    1、浏览器发起 getEncryptionKey 请求,服务器生成一对 256 位的 RSA 公私钥,随机生成一个 rkey,以 rkey 为索引把公私钥存储起来。
    2、服务器把 e(固定为 16 进制的 10001)、n(16 进制表示的 256 位公钥)、rkey 发回给浏览器。
    3、用户输入密码并点击登录时,浏览器把密码用公钥 n 和指数 e 加密,得到 password(16 进制表示的 256 位),连同 rkey 发送给服务器。
    4、服务器根据 rkey 取出私钥,解密 password 得到明文密码,然后就是常规的密码检查流程了。
人人网在实现上述过程的时候存在的漏洞是人人网使用了256位的RSA短公钥,在作者的Core i7上使用msieve工具用了大概3分钟就将RSA破解了。因此,人人网如果要想阻止别人对密码进行破解,可以将使用的RSA公钥改为2048位或更长。
Capture74
可以看到使用RSA非对称加密算法来保护传输中的密码及敏感信息的安全性 与 使用 https进行加密传输有相似之处,但是是不同的。客户端对密码使用RSA加密传输相比Https是不安全的,存在安全隐患,如果被黑客利用就可能被捕获明文密码(参考:http://www.jinglingshu.wiki/?p=6436)。使用RSA非对称加密算法来保护传输中的密码不能替代https的原因是这种方法无法防范MITM中间人攻击,并且攻击过程中不会有任何提示用户的密码就被窃取了。
使用RSA非对称加密算法来保护传输中的密码的过程简化如下:
1. 在server端生成一对RSA密钥,包括public key 和 private key
2. public key传输给客户端浏览器, 客户端浏览器用public key加密敏感数据,比如密码;加密后的密文传回给server,然后server用 private key解密。
3. 注意private key只保存在server端,而public key则分发给所有人。 由于 private key只有server知道,所以密文即使被截获了,也无法解开。
攻击过程如下:
1. 攻击者通过MITM(比如arp欺骗等)劫持server与客户端浏览器之间的http包
2. 攻击者生成一对伪造的RSA密钥: fake public key/fake private key
3. 攻击者将js文件中的public key替换为fake public key,并传输给客户端浏览器
4. 客户端浏览器用 fake public key加密敏感数据,比如密码,并将加密后的数据传输给攻击者
5. 攻击者用fake private key解密,获得明文密码等
6. 攻击者用server的public key加密明文数据,并传送给server
当然,还有更邪恶的攻击办法,由于客户端是通过js加密的密码,攻击者可以在js传给客户端之间将js代码修改,直接去掉这种加密机制来获取明文密码。修改客户端接收的js代码电信运营商可以直接很简单的实现,参考:http://zone.wooyun.org/content/2507。
上面说了客户端使用js对密码进行RSA加密与https相比的缺陷是不能防止中间人攻击,是因为使用js进行RSA加密传输,实施中间人攻击的时候,是不会有任何提示的,一切都会在用户不知情的情况下发生;而使用https时浏览器会针对证书变化做出相应的提醒,来防止中间人攻击。为了抵御中间人攻击,SSL证书需要由可信的SSL证书颁发机构颁发,形成一个证书链(比如Gmail的证书链为:最底层为网域 mail.google.com,上一层为Thawte SGC CA证书颁发机构,最顶层为很有名的VeriSign证书颁发机构)。那么,浏览器除了需要验证域和有效期外,还要检查证书链中的上级证书公钥是否有效, 上级的上级证书公钥是否有效,直至根证书公钥为止。这样就可以有效避免中间人攻击了,因为根证书公钥都是预装在操作系统中的,黑客如果不是暴力破解,无法 得到根证书的私钥,如果黑客自己生成一个私钥,浏览器验证根证书公钥的时候发现无法通过操作系统中预装的公钥加密数据后使用这个私钥进行解密,从而判定这 个公钥是无效的。浏览器验证证书的过程如下:当我们在访问https网站时,浏览器就会自动下载该网站的SSL证书,并对证书的安全性进行检查。由于证书是分等级的,网站拥有者可能从根证书颁发机构领到证书,也可能从根证书的下一级(如某个国家的认证中心,或者是某个省发出的证书)领到证书。假设我们正在访问某个使用 了 SSL技术的网站,IE浏览器就会收到了一个SSL证书,如果这个证书是由根证书颁发机构签发的,IE浏览器就会按照下面的步骤来检查:浏览器使用内 置的根证书中的公钥来对收到的证书进行认证,如果一致,就表示该安全证书是由可信任的颁证机构签发的,这个网站就是安全可靠的;如果该SSL证书不是根服 务器签发的,浏览器就会自动检查上一级的发证机构,直到找到相应的根证书颁发机构,如果该根证书颁发机构是可信的,这个网站的SSL证书也是可信的。ps:系统内置了许多根证书办法机构的公钥,使用这些机构的公钥来验证这些机构对证书的签名是否是正确的。
SSL是在TCP之上建立了一个加密通道,通过这一层的数据经过了加密,因此达到保密的效果。我们知道,https的安全性主要是由SSL证书中的公钥和私钥来保证的。浏览器与服务器经过https建立通讯的时候(不考虑SSL代理方式需要用户提交证书的情况,因为我们现在讨论的是浏览器访问网站,和SSL代理无关)会按照以下步骤保证通讯的安全性:
(1)浏览器与服务器建立TCP连接后,发出一个Clienthello来发起握手,这个消息里面包含了自己可实现的算法列表和其它一些需要的消息。
(2)SSL的服务器端会回应一个Serverhello,这里面确定了这次通信所需要的算法,然后发过去自己的证书,证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
(3)获得网站证书之后浏览器要做以下工作:
        a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等)。浏览器除了需要验证域和有效期外,还要检查证书链中的上级证书公钥是否有效, 上级的上级证书公钥是否有效,直至根证书公钥为止。这样就可以有效避免中间人攻击了,因为根证书公钥都是预装在操作系统中的,黑客如果不是暴力破解,无法 得到根证书的私钥,如果黑客自己生成一个私钥,浏览器验证根证书公钥的时候发现无法通过操作系统中预装的公钥加密数据后使用这个私钥进行解密,从而判定这 个公钥是无效的。如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
        b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
        c) 使用约定好的HASH计算握手消息,并使用生成的随机密码对消息进行加密,最后将之前生成的所有信息发送给网站。
(4)网站接收浏览器发来的数据之后要做以下的操作:
        a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
        b) 使用密码加密一段握手消息,发送给浏览器。
(5)浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。(为什么不直接使用公钥和私钥进行通讯?因为非对称加密比对称加密效率低)
这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。另外,HTTPS一般使用的加密与HASH算法如下:
        非对称加密算法:RSA,DSA/DSS
        对称加密算法:AES,RC4,3DES
        HASH算法:MD5,SHA1,SHA256
其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性。由于浏览器生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄漏。TLS握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。正是由于HTTPS非常的安全,攻击者无法从中找到下手的地方,于是更多的是采用了假证书的手法来欺骗客户端,从而获取明文的信息,但是这些手段都可以被识别出来。

SSL证书验证失败的三点原因:

  1. SSL证书不是由受信任的CA机构颁发的
  2. 证书过期
  3. 访问的网站域名与证书绑定的域名不一致
web证书和浏览器的关系可以参考:http://www.jinglingshu.wiki/?p=6434。
ps:可以看到客户端使用js对密码进行rsa加密传输的方案还是有积极意义的,除去不能抵抗中间人攻击的缺陷外,其他方面都比较完美,特别是成本低廉,因为向权威机构申请https证书很麻烦且需要花费很多钱。使用https除了要花钱外,对每个ssl连接进行加密和解密会增加服务器CPU的负担,影响服务器的性能。用RSA加密实现Web登录密码加密传输的代码实现可以参考:http://www.jinglingshu.wiki/?p=6436。
参考资料:
1、 SSL协议与数字证书原理  http://lulu87.blog.51cto.com/1244696/379556
2、 HTTPS那些事(一)HTTPS原理  http://www.guokr.com/post/114121/
3、HTTPS那些事(二)SSL证书   http://www.guokr.com/post/116169/
4、HTTPS那些事(三)攻击实例与防御   http://www.guokr.com/blog/148613/
5、SSL安全证书   http://blog.sina.com.cn/s/blog_5fb9ce0e0100gt71.html
来自为知笔记(Wiz)

转载请注明:jinglingshu的博客 » 《解开人人网登录密码的 RSA 加密》学习

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址