客户端服务端加密与通信安全及实际应用 (2)

         具体来说,SSL/TLS 并不是一种算法,而是为了保证通信安全的一种协议,当然里面用到了相关加密算法如非对称加密算法、数字证书、HD秘钥交换算法等。Https多使用这种协议进行网络数据的传输。

        

bg2014092003

通过上述这张图大致了解这种协议的通信过程。上述过程的目的只是为了获取比较安全的Session Key,当然这个Key需要Client Random + Server Random + Permaster secret 三者共同生成,安全性较高。Session key 用于后面通信对数据进行对称加密。 双方获得Session Key 后通过http协议进行数据传输,Session Key 用来对http传输的内容进行加密。

关于SSL/TLS的详细讲解请参考 阮一峰的博客链接。

TOTP

TOTP 的全称是"基于时间的一次性密码"(Time-based One-time Password)。它是公认的可靠解决方案,已经写入国际标准 RFC6238。

它的步骤如下。

第一步:用户开启双因素认证后,服务器生成一个密钥。

第二步:服务器提示用户扫描二维码(或者使用其他方式),把密钥保存到用户的手机。也就是说,服务器和用户的手机,现在都有了同一把密钥。

第四步,服务器也使用密钥和当前时间戳,生成一个哈希,跟用户提交的哈希比对。只要两者不一致,就拒绝登录。

注意,密钥必须跟手机绑定。一旦用户更换手机,就必须生成全新的密钥。

算法原理:

TC = floor((unixtime(now) − unixtime(T0)) / TS)

上面的公式中,TC 表示一个时间计数器,unixtime(now)是当前 Unix 时间戳,unixtime(T0)是约定的起始时间点的时间戳,默认是0,也就是1970年1月1日。TS 则是哈希有效期的时间长度,默认是30秒。因此,上面的公式就变成下面的形式。

TC = floor(unixtime(now) / 30)

所以,只要在 30 秒以内,TC 的值都是一样的。前提是服务器和手机的时间必须同步。

接下来,就可以算出哈希了。

TOTP = HASH(SecretKey, TC)

TOTP 有硬件生成器和软件生成器之分,都是采用上面的算法。

数字签名过程(防止公钥被伪造 ):

1、通过公钥私钥进行加密通信,发送方发送的内容只有通过私钥才能打开,所以保证了发送信息的私密性。

2、第三方可以把伪造的公钥给发送方,再截获发送的信息,通过自己的私钥解密信息。 这里Https协议中引入的CA(certificate authority)可以很好的解决这个问题。证书中心用自己的私钥为传输的公钥和一些信息进行加密,发送者可以通过证书中的公钥解密证书中的信息,这些信息中包含了需要传送的公钥。(暂且认为证书中的信息都是对的,一般证书中心都是可靠性比较高的机构颁发的)

通过Chrome打开百度网页的时候,F12建, Security菜单栏可以看到百度的证书。证书里面包含:颁发者、颁给者、公钥、有效期等信息。

 

签名的实际应用

      现在有三个参数(A、B、C 封装在一个类Data中)需要传输到服务端,那么如何保证 这三个数据不是别人伪造发送的,可以在传这三个数据数据之外再添加一个数据 sign(String类型)。

  客户端sign的生成算法:

  第一步:对三个参数名称(与服务端提前约定好传输变量的名称)进行字典排序,拼接成字符串StringA(key1=value1&key2=value2&key3=value3),同时字符串的拼接遵循指定的规则。

  第二步:在stringA最后拼接秘钥key(只有服务端和客户端知道,第三方不能获得,这也是签名的关键)得到finalStringA

  第三部: 对finalStringA 做MD5计算,并将字符数组转换成16进制的字符串。

    自此sign生成过程结束。

生成根据Data 中A、B、C三个参数的值以及Key 生成了sign之后,将sign值赋给Data中的sign。将Data转换成JSONObject格式再转换成字符数组

通过 HttpURLConnection传送到服务端。服务端通过拿到A、B、C的数值后会自己通过同样的算法生成sign,如果和客户端传送的Sign不一样则这次传送可能是第三方伪造的。

  这种签名就保证了第三方不能伪造数据和服务端进行通信。(具体的流程如下图所示)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsdzw.html