入门密码学②Hash
单向散列函数(哈希函数)
单向散列函数 有一个输入和一个输出,其中输入称为消息,输出称为散列值,也就是Hash。散列值的长度和消息的长度无关,单向散列函数都会计算出固定长度的散列值。
单向散列函数的性质
- 根据任意长度的消息计算出固定长度的散列值
- 能够快速计算出散列值
- 消息不同散列值也不同(抗碰撞性,降低出现两个不同的消息产生同一散列值的情况)
- 具备单向性(不可逆)
散列冲突
如果不同的输入得到了同一个散列值,就发生了散列冲突(哈希碰撞)。难以发现碰撞的性质称为抗碰撞性,单向散列函数必须确保要找到和该消息具有相同散列值的另外一条消息是非常困难的,这一性质称为弱抗碰撞性。要找到散列值相同的两条不同的消息是非常困难的性质称为强抗碰撞性。
实际应用
-
检测文件的完整性
-
基于口令的加密
将口令(Password)和盐(一般是时间戳或者随机数)混合后计算 Hash 值。 -
消息认证码(HMAC)
消息认证码将共享密钥和消息进行混合后计算的 Hash 值,用于防止通讯过程中的错误、篡改及伪装。 -
数字签名
Hash+RSA -
随机数
-
token
常见的单向散列函数
- MD4、MD5 (Message Digest)
128 位,呈现形式为长度 32 位的十六进制字符串 - SHA-1
160 位,呈现形式为长度 40 位的十六进制字符串 - SHA-256
256 位,呈现形式为长度 64 位的十六进制字符串 - SHA-384
384 位,呈现形式为长度 96 位的十六进制字符串 - SHA-512
512 位,呈现形式为长度 128 位的十六进制字符串
单向散列函数的缺点
- 单纯的单向散列函数无法识别伪装,只能检查完整性
HMAC
什么是消息认证码
消息认证码(Message Authentication Code) 是一种确认完整性并进行认证的技术,简称为 MAC。 消息认证码的输入包括任意长度的消息和一个发送者与接受者之前共享的密钥,它可以输出固定长度的数据,这个数据称为 MAC 值。可以理解为,消息认证码是一种密钥相关联的单向散列函数。
什么是 HMAC
HMAC 是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写,是一种使用单向散列函数来构造消息认证码的方法(RFC2104),例如:使用 SHA-1
构造的 HMAC
,称为 HMAC-SHA-1
。HMAC
运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。
HMAC 的步骤
-
定义两个不同的固定字符串
ipad
和opad
如下(“i”和“o”表示内部和外部):ipad=一个字节(byte)的0x36 (00110110)重复B次,达到分组长度 opad=一个字节(byte)的0x5C (01011100)重复B次,达到分组长度
-
密钥填充
如果密钥比单向散列函数的分组长度更短,则需要在末尾填充,直到与单向散列函数的分组长度一致 -
填充后的密钥与
ipad
进行 XOR 运算,得到ipadKey
-
与消息组合
将ipadKey
与消息进行组合。 -
计算散列值
a
对组合的值输入单向散列函数,得到散列值a
-
填充后的密钥与
opad
进行 XOR 运算,得到opadKey
-
与散列值组合
将散列值a
拼接到opadKey
后面 -
计算散列值,得到最终的
MAC
值。
HMAC 的应用
HMAC
主要应用在身份验证中,它的使用方法是这样的:
- 客户端发出登录请求(假设是浏览器的GET请求)
- 服务器返回一个随机值(一般是时间戳,防止重放攻击),并在会话中记录这个随机值
- 客户端将该随机值作为密钥,用户密码进行hmac运算,然后提交给服务器.
- 服务器读取用户数据库中的用户密码和步骤2中发送的随机值做与客户端一样的hmac运算,然后与用户发送的结果比较,如果结果一致则验证用户合法。
消息认证码的缺点
- 单纯的消息认证码无法防止否认,只能用于认证。
数字签名
什么是数字签名
数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名,但是在使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于生成数字签名,另一个用于验证数字签名。数字签名是非对称密钥加密技术与数字摘要技术的应用。
公钥密码与数字签名
类型 | 私钥 | 公钥 |
---|---|---|
公钥密码 | 解密时使用 | 加密时使用 |
数字签名 | 生成签名时使用 | 验证签名时使用 |
数字签名的过程
数字签名的过程.png数字签名的应用
- 安全信息公告
- 软件下载
- 公钥证书
- SSL/TLS