HMAC算法

HMAC算法

2023年7月27日发(作者:)

HMAC算法HMAC算法的定义和⽤法HMAC算法是⼀种基于密钥的报⽂完整性的验证⽅法 ,其安全性是建⽴在Hash加密算法基础上的。它要求通信双⽅共享密钥、约定算法、对报⽂进⾏Hash运算,形成固定长度的认证码。通信双⽅通过认证码的校验来确定报⽂的合法性。 HMAC算法可以⽤来作加密、数字签名、报⽂验证等 。(我感觉实际情况中⽤HMAC做加密也是为的不可逆加密,不像⽤DES/AES这种可逆加密;感觉HMAC和随机盐Hash算法⾮常像)⼀句话总结:HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利⽤哈希算法,以⼀个密钥和⼀个消息为输⼊,⽣成⼀个消息摘要作为输出。HMAC算法是⼀种执⾏“校验和”的算法,它通过对数据进⾏“校验”来检查数据是否被更改了。在发送数据以前,HMAC算法对数据块和双⽅约定的公钥进⾏“散列操作”,以⽣成称为“摘要”的东西,附加在待发送的数据块中。当数据和摘要到达其⽬的地时,就使⽤HMAC算法来⽣成另⼀个校验和,如果两个数字相匹配,那么数据未被做任何篡改。否则,就意味着数据在传输或存储过程中被某些居⼼叵测的⼈作了⼿脚。通过哈希算法,我们可以验证⼀段数据是否有效,⽅法就是对⽐该数据的哈希值,例如,判断⽤户⼝令是否正确,我们⽤保存在数据库中的password_md5对⽐计算md5(password)的结果,如果⼀致,⽤户输⼊的⼝令就是正确的。为了防⽌⿊客通过彩虹表根据哈希值反推原始⼝令,在计算哈希的时候,不能仅针对原始输⼊计算,需要增加⼀个salt来使得相同的输⼊也能得到不同的哈希,这样,⼤⼤增加了⿊客破解的难度。如果salt是我们⾃⼰随机⽣成的,通常我们计算MD5时采⽤md5(message + salt)。但实际上,把salt看做⼀个“⼝令”,加salt的哈希就是:计算⼀段message的哈希时,根据不同⼝令计算出不同的哈希。要验证哈希值,必须同时提供正确的⼝令。这实际上就是Hmac算法:Keyed-Hashing for Message Authentication。它通过⼀个标准算法,在计算哈希的过程中,把key混⼊计算过程中。和我们⾃定义的加salt算法不同,Hmac算法针对所有哈希算法都通⽤,⽆论是MD5还是SHA-1。采⽤Hmac替代我们⾃⼰的salt算法,可以使程序算法更标准化,也更安全。使⽤场景:该场景就是⽤来验证⽂件的安全性服务端⽣成key,传给客户端;客户端使⽤key将帐号和密码做HMAC,⽣成⼀串散列值,传给服务端;服务端使⽤key和数据库中⽤户和密码做HMAC计算散列值,⽐对来⾃客户端的散列值。HMAC算法的典型应⽤:该应⽤提供了⼀次安全响应的过程。HMAC算法的⼀个典型应⽤是⽤在“挑战/响应”(Challenge/Response)⾝份认证中,认证流程如下:(1) 先由客户端向服务器发出⼀个验证请求。(2) 服务器接到此请求后⽣成⼀个随机数并通过⽹络传输给客户端(此为挑战)。(3)客户端将收到的随机数与⾃⼰的密钥进⾏HMAC-SHA1运算并得到⼀个结果作为认证证据传给服务器(此为响应)。(4)与此同时,服务器也使⽤该随机数与存储在服务器数据库中的该客户密钥进⾏HMAC-SHA1运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是⼀个合法⽤户Allocate the operation handle分配⼀个进⾏密码操作句柄,并设置密码的类型和⽅式TEE_Result TEE_AllocateOperation(TEE_OperationHandle *operation, uint32_t algorithm, uint32_t mode, uint32_t maxKeySize)分配⼀个未初始化的临时空间TEE_Result TEE_AllocateTransientObject(TEE_ObjectType objectType, uint32_t maxKeySize, TEE_ObjectHandle *object)将属性变量填充/赋值到空间变量⾥TEE_Result TEE_PopulateTransientObject(TEE_ObjectHandle object, const TEE_Attribute *attrs, uint32_t attrCount)把存放密钥的Object内容保存到句柄中将保存key得object保存到handleTEE_Result TEE_SetOperationKey(TEE_OperationHandle operation, TEE_ObjectHandle key)分配⼀个未初始化的临时空间TEE_Result TEE_AllocateTransientObject(TEE_ObjectType objectType, uint32_t maxKeySize, TEE_ObjectHandle *object)导出keyvoid TEE_DeriveKey(TEE_OperationHandle operation, const TEE_Attribute *params, uint32_t paramCount, TEE_ObjectHandle derivedKey)TEE_GetObjectBufferAttribute函数的作⽤是从对象中提取⼀个缓冲区属性TEE_Result TEE_GetObjectBufferAttribute(TEE_ObjectHandle object, uint32_t attributeID, void *buffer, uint32_t *size)1、Cryptographic Operations API 加解密函数介绍() (1)、Generic Operation Functions

TEE_AllocateOperation

TEE_FreeOperation

TEE_SetOperationKey

TEE_SetOperationKey2

(2)、Message Digest Functions 消息摘要

TEE_DigestUpdate

TEE_DigestDoFinal

(3)、Symmetric Cipher Functions 对称加解密

TEE_CipherInit

TEE_CipherUpdate

TEE_CipherDoFinal

(4)、Asymmetric Functions ⾮对称加解密

TEE_AsymmetricEncrypt, TEE_AsymmetricDecrypt

TEE_AsymmetricSignDigest 和 TEE_AsymmetricVerifyDigest

(4)、Random Data Generation Function 随机数

TEE_GenerateRandom

发布者:admin,转转请注明出处:http://www.yc00.com/web/1690460776a352571.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信