zoukankan      html  css  js  c++  java
  • HMAC是一种利用哈希函数构造消息认证码的方法

    HMAC是一种利用哈希函数构造消息认证码的方法

    来源:HMAC算法 HMAC的图解

    HMAC是一种使用单向散列函数来构造消息认证码的方法,其中HMAC中的H就是Hash的意思。

    HMAC中所使用的单向散列函数并不仅限于一种,任何高强度的单向散列函数都可以被用于HMAC,如果将来设计出的新的单向散列函数,也同样可以使用。

    使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512所构造的HMAC,分别称为HMAC-SHA1、HMAC-SHA-224、HMAC-SHA-384、HMAC-SHA-512

    过程:(计算text内容的HMAC值)

    H( K XOR opad, H(K XOR ipad, text))

    我们假设H是一个将数据块用一个基本的迭代压缩函数来加密的散列函数。 我们用B来表示数据块的字长(即分组长度)。(以上说提到的散列函数的分割数据块字长B=64), 用L来表示散列函数的输出数据字长(MD5中L=16(128位),SHA—1中L=20(160位))。 K是一个密钥,H是HMAC的加密用的散列函数,XOR异或运算,

    我们将定义两个固定且不同的字符串ipad,opad: (‘i','o'标志内部与外部) ipad = the byte 0x36 repeated B times opad = the byte 0x5C repeated B times.

    考虑到密钥K的长度可能小于B,所以:

    当K长度小于B(即分组长度)时,则在K之后补0(即0x00),直到其长度达到单向散列函数的分组长度B为止。 (例如,如果K的字长是20字节,B=64字节,则K后会加入44个零字节0x00) 当密钥K的长度大于分组长度B时,首先使用散列函数H处理K,然后H输出的L长度的字符串作为K,即K=H(K)。

    计算‘text'的HMAC: H( K XOR opad, H(K XOR ipad, text)) HMAC过程:

    (1) 密钥填充:(当K长小于分组长度B时)在密钥K后面添加0来创建一个子长为B的字符串。 (例如,如果K的字长是20字节,B=64字节,则K后会加入44个零字节0x00) 若K长大于分组长度B,则K=H(K),先用散列函数H处理K。

    (2)填充后的密钥与ipad的XOR: 将上一步生成的B字长的字符串与ipad做异或运算xor。

    (3)与消息组合: 将数据流text填充至第二步的结果字符串中。

    (4) 计算散列值:用H作用于第三步生成的数据流。

    (5) 填充后的密钥与opad的XOR:将第一步生成的B字长字符串与opad做异或运算。

    (6) 与散列值组合:再将第四步的结果填充进第五步的结果中。

    (7) 计算散列值:用H作用于第六步生成的数据流,输出最终结果。

     

    HMAC的典型应用 HMAC的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中,认证流程如下: (1) 先由客户端向服务器发出一个验证请求。 (2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。 (3) 客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。 (4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户 。

     

    记住公式:H( K XOR opad, H(K XOR ipad, text))就ok了

  • 相关阅读:
    Oracle 按一行里某个字段里的值分割成多行进行展示
    Property or method "openPageOffice" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by
    SpringBoot 项目启动 Failed to convert value of type 'java.lang.String' to required type 'cn.com.goldenwater.dcproj.dao.TacPageOfficePblmListDao';
    Maven 设置阿里镜像
    JS 日期格式化,留作参考
    JS 过滤数组里对象的某个属性
    原生JS实现简单富文本编辑器2
    Chrome控制台使用详解
    android权限(permission)大全
    不借助第三方网站四步实现手机网站转安卓APP
  • 原文地址:https://www.cnblogs.com/forforever/p/12633536.html
Copyright © 2011-2022 走看看