HMAC与数字签名

密码学与安全技术

数字签名

数字签名用于证实某数字内容的完整性integrity和来源(或不可抵赖性non-repudiation)

典型场景:A需要给B一份数据,但B如何确认这份数据是来自于A且没有被篡改过呢?
方法:
1. A将数据通过摘要算法进行计算生成摘要信息。
2. A将摘要信息通过自己的私钥进行加密生成加密串。
3. A将数据和加密串一起发送给B。
4. B收到A的数据和加密串之后,通过A的公钥进行解密得到A数据的摘要信息。
5. B再将A发送数据部分进行进行摘要计算,如果生成的摘要与传递的摘要相同则认为数据没有被篡改。

问题思考:
1. 摘要算法是否两边统一。
2. 私钥和公钥的持有方能否对调:不能,因为为了验证A是A,必须是用A私钥进行加密,公钥进行解密。如果反过来,公钥加密则不能做到验证身份的功能,因为公钥所有人都持有。
3. 公钥能够在网络中传输,而私钥不能再网络中传输,防止被窃取。
4. B通过比较摘要保证内容不被篡改即保证了数据在传输过程中的完整性。
5. B通过持有A的公钥,保证此数据来自于A而不是其他人(前提私钥只有A知道,其他人不知道A的私钥)

HMAC

全称(Hash-based Message Authentication Code,即基于Hash的消息的认证码)。
- 基本过程为对某个消息,利用提前共享的对称密钥和Hash算法进行加密处理,得到HMAC值。
- 该HMAC值提供方可以证明自己拥有共享密钥的对称密钥,并且消息自身可以利用HMAC确保未经篡改。

定义HMAC需要一个加密用散列函数(表示为H,可以是MD5或者SHA-1)和一个密钥K。我们用B来表示数据块的字节数。(以上所提到的散列函数的分割数据块字长B=64),用L来表示散列函数的输出数据字节数(MD5中L=16,SHA-1中L=20)。鉴别密钥的长度可以是小于等于数据块字长的任何正整数值。应用程序中使用的密钥长度若是比B大,则首先用使用散列函数H作用于它,然后用H输出的L长度字符串作为在HMAC中实际使用的密钥。一般情况下,推荐的最小密钥K长度是L个字节。(来自百度百科)

使用HMAC的客户端认证流程:
1. 客户端向服务器发起连接。
2. 服务器发送一个随机数消息,保留在session中。
3. 客户端得到随机数,通过将随机数(B) + 认证信息(K) 通过HASH算法计算出摘要信息,并通过对称加密算法进行加密。
4. 客户端将密文数据传递给服务器。
5. 服务器通过对称加密解密。
6. 服务器通过自己存储的认证信息+session中的随机数,以及相同的HASH算法重新计算摘要值,如果相同则认为客户端身份合法。

  • 问题思考:
  • HMAC 的作用,能够保证如下几件事情
    1. 能够保证通信双方持有的共享密钥一致,或者说认证信息一致,再应用到实例中就是用户登录的密码与服务器存储的一致。
    2. 能够保证共享密钥不会再认证过程中被窃取,已经做过为摘要生成的密钥参数使用。
    3. 能够保证报文在传输过程中没有被篡改,传输数据正确。

说白了HMAC的应用场景就是,我持有你的认证信息,你来向我发起登录,我要识别出是你,但又要保证你的认证信息不能被别人轻易获取,还要保证传递过程中报文的正确性。

承接各种网站开发与修改、爬虫、数据采集分析、小程序等任务

Html+Css+JS+PHP+Nodejs+Python

专治网站各种不服

一起探讨,互相学习,共同进步!有事儿您说话。

This entry was posted in 其它 and tagged , by 织梦先生. Bookmark the permalink.