关于HMAC我们应该知道什么?

工作原理

1、首先,选择一个适当的哈希函数(如SHA-256、MD5等)和一个密钥。
2、将要认证的消息与密钥进行组合,并通过哈希函数对组合后的数据进行运算,生成一个哈希值。
3、将生成的哈希值作为认证标签附加在原始消息中。
4、在验证时,接收方使用相同的密钥和哈希函数对接收到的消息进行处理,并得到一个哈希值。
5、将接收到的哈希值与发送方附加的认证标签进行比较,以验证消息的完整性和真实性。

主要作用

1、数据完整性:HMAC可以检测数据是否在传输过程中被篡改或损坏。如果接收到的消息的哈希值与认证标签不匹配,说明数据可能被篡改了。
2、身份验证:通过使用共享的密钥,发送方可以证明其身份。接收方可以验证接收到的消息确实来自发送方,而不是伪造的数据。
3、防止重放攻击:HMAC中使用了密钥,这使得攻击者无法重复发送已经被认证过的消息,从而防止了重放攻击。

算法原理

![[Pasted image 20230812084217.png]]

算法输出表达式如下:

HMAC(M,K) = H((K XOR opad) + H((K XOR ipad) + M))

HMAC函数中的代码主要是按照这个表达式来写,具体可看注释。
这里的k2是原密钥经过扩展以后得到的,代码中用的长度为512比特。
初始密钥k的长度随机,如果长度大于b(b为一个分组的比特数)则先进行哈希,再补0;如果长度小于b,直接在左边补0。

注意

HMAC:

主要作用是提供数据完整性和身份验证

基于基于对称密钥

数据可能被拦截,新的数据使用对称密钥继续做HMAC后传输,接收方并不能知道是否被篡改

数字签名:

作用也是确保数据的完整性、真实性和防止篡改(抗抵赖性)

基于非对称密钥

私钥不泄漏,只有私钥持有者可以签名,所以能保证抗抵赖性

私钥存储

在Android开发中,用于签名的私钥应当以安全的方式存储。以下是几种常见的存储方法:

1、使用密钥库(KeyStore):Android提供了KeyStore机制,可以将私钥存储在安全的密钥库中。密钥库本身可以受到操作系统级别的保护,并可以设置密码或者其他认证手段来保护密钥的访问。

2、使用安全硬件模块(HSM):在支持安全硬件的设备上,可以使用安全硬件模块(如TEE、Secure Element等)存储和处理私钥。这些硬件模块提供了更高级别的安全性保障,可防止私钥泄漏和未经授权的使用。

3、使用密钥对保护:将私钥存储在应用的私有目录中,并使用文件加密或者其他保护措施来保护私钥的机密性。可以使用Android的加密API,如Android Keystore System或者加密算法库来实现私钥的保护。

无论使用何种方式,都需要注意以下几点:

  • 确保私钥存储的位置具有足够的安全性,例如需要用户认证、不受root权限影响等。
  • 定期更换私钥,以减少潜在泄漏的影响范围。
  • 对存储私钥的设备进行定期检查,确保其完整性和安全性。

猜你喜欢

转载自blog.csdn.net/u010671061/article/details/132450977