以下是分析节选,对于更详细的描述可以查阅RFC2104文档。
 
 
HMAC需要一个加密用散列函数(表示为H)和一个密钥K。
假设H是一个将数据块用一个基本的迭代压缩函数来加密的散列函数。
用B来表示数据块的长。(以上说提到的散列函数的分割数据块长B=64),用L来表示散列函数的输出数据长(MD5中L=16,SHA—1中L=20)。
 
 

密钥的长度可以是小于等于数据块长的任何正整数值。应用程序中使用的密钥长度若是比B大,则首先用使用散列 
函数H作用于它,然后用H输出的L长度字符串作为在HMAC中实际使用的密钥。

一般情况下,推荐的最小密钥K长度是L长。(与H的输出数据长度相等)。 
我们将定义两个固定且不同的字符串ipad,opad:

ipad = the byte 0x36 repeated B times
opad = the byte 0x5C repeated B times.

计算‘text'的HMAC:

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

即为以下步骤:


void hmac_md5(char* out, char* data, int dlen, char* key, int klen)
{

(1) 在密钥key后面添加0来创建一个长为B(64字节)的字符串(str)。

(2) 将上一步生成的字符串(str)与ipad(0x36)做异或运算,形成结果字符串(istr)。 
  
(3) 将数据流data附加到第二步的结果字符串(istr)的末尾。 
  
(4) 做md5运算于第三步生成的数据流(istr)。 
  
(5) 将第一步生成的字符串(str)与opad(0x5c)做异或运算,形成结果字符串(ostr)。
  
(6) 再将第四步的结果(istr)附加到第五步的结果字符串(ostr)的末尾。 
  
(7) 做md5运算于第六步生成的数据流(ostr),输出最终结果(out)。

}

注:如果第一步中,key的长度klen大于64字节,则先进行md5运算,使其长度klen=16字节。

HMAC-MD5算法原理及实现的更多相关文章

  1. md5算法原理一窥(其一)

    首先,需要了解的事,md5并不是传说中的加密算法,只是一种散列算法.其加密的算法并不是我们说所的那样固定不变,只是一种映射的关系. 所以解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD ...

  2. 【密码学】MD5算法原理

    MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能:    输 ...

  3. 【编程开发】MD5算法原理

    MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用.     MD5功能: ...

  4. Algorithm:MD5算法原理说明

    MD5算法实现: 输入:不定长度信息(要加密的信息) 输出:固定长度128-bits.由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值. 基本方式为:求余.取余.调整长度.与链接 ...

  5. MD5算法原理

    //消息摘要:将任意长度的字符数组处理成定长的字符数组,用于确保原字符串不被修改, //也可以用做密码确认,如果密码一致,则MD5产生后的值必然一致,否则不相同 public class DataUt ...

  6. Atitit.md5 实现原理

    Atitit.md5 实现原理 1. 算法流程图2 2. MD5算法过程:2 2.1. 3. 处理分组数据3 3. MD5加密字符串实例5 4. Md5的历史7 4.1.1. MD27 4.1.2. ...

  7. MD5算法——C++实现

    MD5算法原理 MD5消息摘要算法,属Hash算法一类.MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要. 具体实现可参考博客 https://blog.csdn.net/sinat ...

  8. MD5值算法原理

    MD5原理说明 一.MD5算法介绍. MD5,即“Message-Digest Algorithm 5(信息-摘要算法)”,从名字来看就知道它是从MD3.MD4发展而来的一种加密算法,其主要通过采集文 ...

  9. MD5算法的原理与实现

    ***********************************************声明************************************************ 原创 ...

  10. atitit.md5算法的原理 与 总结

    atitit.md5算法的原理 与 总结 1. MD5的位数 128位1 2. 字节数组转换为32位字符串 base161 2.1. 十六进制字符用4个二进制位来表示1 2.2. byte[]和十六进 ...

随机推荐

  1. 快速排序(java版)

    public class QuickSortTest{ //比较与交换 private static int partition(int[] source, int low, int hight) { ...

  2. 高仿700Bike的界面图片

    下面展示本人高仿项目"700Bike"的已经完成的界面:  

  3. QA:Failed to deploy artifacts from/to snapshots XX Failed to transfer file Return code is: 405, ReasonPhrase:Method Not Allowed.

    QA: Failed to deploy artifacts from/to snapshots XX Failed to transfer file Return code is: 405, Rea ...

  4. javascript 如何访问 action或者controller 传给 jsp 页面的值

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  5. MySQL 5.6 中的 TIMESTAMP 和 explicit_defaults_for_timestamp 参数

    安装MySQL时,有warning: [root@localhost mysql]# scripts/mysql_install_db --user=mysql Installing MySQL sy ...

  6. 【linux】关于分析系统问题的前几分钟

    为了解决性能问题,你登入了一台Linux服务器,在最开始的一分钟内需要查看什么?你可以在几分钟内就对系统资源的使用情况和进程的运行状况有大体上的了解.无非是先查看错误信息和饱和指标,再看下资源的使用量 ...

  7. sql server 之函数小技巧 && 整数类型为空是用空字符串替代实现

    1.判空函数 说明:使用指定的替换值替换 NULL. 语法:ISNULL ( check_expression , replacement_value ) 参数: check_expression:将 ...

  8. 令人哭笑不得的org.hibernate.MappingException: Unknown entity

    今天处理的任务是从一套系统中分离出微信易信功能代码添加到另一套系统中..本来是一个很简单的任务,但是分离移植过去后,一运行报了个错: nested exception is org.hibernate ...

  9. Maximum Subsequence Sum(接上篇)

    Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...

  10. 学完STM32开发板,就选4412开发板让你有目标的学习嵌入式开发

    600余页用户使用手册 linux实验手册(资料不断更新)100期配套零基础高清视频教程 轻松入门 (资料不断更新)2000人售后认证群 在线支持 售后无忧 源码全开源  原厂技术资料经典学习书籍推荐 ...