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保存到handle

TEE_Result TEE_SetOperationKey(TEE_OperationHandle operation,
          TEE_ObjectHandle key)

分配一个未初始化的临时空间

TEE_Result TEE_AllocateTransientObject(TEE_ObjectType objectType,
           uint32_t maxKeySize,
           TEE_ObjectHandle *object)

导出key

void 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值