RSA 的网络安全模型、iOS 签名机制总结
一、登录、登录保持
登录机制分为三个阶段:
1、登录验证:指客户端提供用户名和密码,向服务器提出登录请求,服务器判断客户端是否可以登录并向客户端确认。
2、登录保持:是指客户端登录后,服务器能够分辨出已登录的客户端,并为其持续提供登权限的服务器。
3、退出:是指客户端主动退出登录状态。
第一种网络请求情况(安全级别:II)
一般的情况是这样:一旦用户登陆成功(单方面 md5 加密:服务器加密则客户端不加密,客户端加密则明文传输),服务器为客户端分配 sessionID(也成为 userID),然后每次网络请求都将 sessionID 当做参数传给服务器。
优点:
能够保持用户登录状态、区分用户,相对于不返回任何信息的登录要安全一些。
缺点:
如果通过网络嗅探器(青花瓷)可以获取到http的链接,服务器返回的 sessionID 可以被获取到,会造成信息泄露,并且还能被伪造请求。
第二种网络请求情况(安全级别:III)
第一种存在明显的安全隐患,但是好多 APP 依然采用第一种方法去实现登录和网络请求,但是对于安全级别比较高的 APP,已经不太试用。所以在此基础上进行优化---采用非对称加密(公钥、私钥)。
登录模型
客户端第一次发出登录请求时,用户密码以明文的方式传输,一旦被截获,后果严重,因此密码需要加密,例如可以采用RSA非对称加密,具体流程如下:
1️⃣ 客户端向服务器第一次发起登录请求(不传输用户名和密码)
2️⃣ 服务器利用 RSA 算法产生一对公钥和私钥,并保留私钥,将公钥发送到客户端。
3️⃣ 客户端收到公钥后,加密用户密码,向服务器发起第二次登录请求(传输用户名和加密后的密码)
4️⃣ 服务器利用保留的私钥对密文进行解密,得到真正的密码
第三种网络请求情况(安全级别:IIII)
再仔细核对上述的登录流程,我们发现服务器判断用户是否登录,完全是依赖于 sessionID,一旦其被截获黑客就可以模拟出用户的请求、于是需要引用 token 的概念:用户登陆成功后,服务器不但为其分配了sessionID还分配了 token,token 是维持登录状态的关键秘密数据。在服务器向客户端发送的token数据,也需要加密。
- 客户端向服务器第一次发起登录请求(不传输用户名和密码)服务器利用 RSA 算法产生一堆公钥和私钥,并保留私钥,将公钥发送到客户端。
- 客户端收到公钥后,加密用户密码,向服务器发送用户名和加密后的用户密码,同时另外产生一对公钥和私钥,自己保留私钥,向服务器发送公钥,于是第二次登录请求传输用户名和加密后的密码以及客户端生成的公钥。
- 服务器利用保留的私钥对密文进行解密,得到真正的密码。经过判断,确定用户可以登录后,生成sessionID和token,同时利用客户端发送的公钥,对token进行加密。最后将sessionID和加密后的token返回客户端。
- 客户端利用自己生成的私钥对token密文解密,得到真正的token。
登录保持(http 数据请求阶段)
引入 token 之后,http 请求被获取的问题便可以得到解决。客户端将 token和其他的一些变量,利用散列加密算法得到签名后,连同 sessionID 一并发给服务器。服务器取出保存于服务器端的 token,利用相同的法则生成校验签名,如果客户端签名与服务器的校验签名一致,就认为请求来自登录的客户端。(与支付宝一样的机制)
注:token 失效的两种情况:1.用户退出系统 2. token 在后台的规定时间内失效
失效原理:在服务器端的 redis 中删除相应 key 为 session 的键值对。
二、散列算法
散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。
散列算法可以用来加密 token 生成签名,以便 token 信息不暴露在网络同时还能验证登录的有效性。
MD5
全写:Message Digest Algorithm MD5 (消息摘要算法第五版)
输出:128 bit
MD5 算法具有以下特点:
1.压缩性 :任何长度的数据算出的 MD5 的值长度都是固定的
2.容易计算 :从原数据计算出 MD5 值很容易
3.抗修改性 :对原数据进行任何改动,所得到的 MD5 值都会有很大的区别。
4.弱抗碰撞:已知原数据和其 MD5 值,想找到一个具有相同 MD5 值的数据是很困难的。
5.强抗碰撞:想找到两个不同的数据,使它们具有相同的 MD5 值是很困难的。
MD5 已老,在安全性要求比较高的场合不建议使用。
SHA1
全名:安全哈希算法(Secure Hash Algorithm)
输出:160 bit
1.对强行攻击的安全性:SHA1 比 MD5 要长 32 位,使用强行攻击。对于 MD5 的难度是 2^128 而对于 SHA1 的难度是 2^160,所以 SHA1 对于强行攻击有更大的强度。
2.对密码分析的安全性:由于 MD5 的设计易受密码分析的攻击,SHA1 显得不易受这样的攻击。
3.速度:在相同的硬件上,SHA1 的运行速度比 MD5 慢
加盐
加盐就是在原本需要加密的信息的基础上,加入其他内容 salt。签名的生成就是一次加盐的过程。
对称加密
本系统使用对称加密对用户密码进行加密以及生成 token 字符串
AES加密:高级加密(Advanced Encryption Standard)
非对称加密
RSA 是目前最有影响力的公钥加密算法,它能够抵抗目前为止已知的 绝大多数的密码攻击,已被 ISO 推荐为公钥数据加密标准。RSA 的安全基于大数分解的难度。其公钥和私钥是一对大素数(100 到 200 位十进制数或者更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个素数之积
网友评论