hmac
来源:互联网 发布:网络安全法宣传周展板 编辑:程序博客网 时间:2024/05/16 12:22
算法:
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:(‘i’,‘o’表示内部与外部)
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))
计算步骤:
在密钥 K 后面添加 0 来创建一个子长为 B 的字符串。(例如,如果 K 的字长是 20 字节,B=60 字节,则 K 后会加入 44 个零字节0x00)
将上一步生成的 B 字长的字符串与 ipad 做异或运算
将数据流 text 填充至第二步的结果字符串中
用 H 作用于第三步生成的数据流
将第一步生成的 B 字长字符串与 opad 做异或运算
再将第四步的结果填充进第五步的结果中
用 H 作用于第六步生成的数据流,输出最终结果
实现:基于MD5散列函数的hamc
import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class HMac { private static int B = 64; static { try { B = MessageDigest.getInstance("md5").getDigestLength(); } catch (Exception e) { e.printStackTrace(); } } public static byte[] HmacMD5(byte[] data, byte[] key) { if (key.length > B) { key = md5(key); } if (key.length < B) { byte[] newKey = new byte[64]; for (int i = 0; i < B; i++) { if (i < key.length) { newKey[i] = key[i]; } else { newKey[i] = 0x00; } } key = newKey; } byte[] ipad = new byte[B]; byte[] opad = new byte[B]; for (int i = 0; i < B; i++) { ipad[i] = 0x36; opad[i] = 0x5C; } // H (K XOR opad, H (K XOR ipad, text)) byte[] K = new byte[B + data.length]; for (int i = 0; i < B; i++) { K[i] = (byte) (key[i] ^ ipad[i]); } System.arraycopy(data, 0, K, B, data.length);//K = concat(k,data) data = md5(K); K = new byte[B + data.length]; for (int i = 0; i < B; i++) { K[i] = (byte) (key[i] ^ opad[i]); } System.arraycopy(data, 0, K, B, data.length);//K = concat(k,data) return md5(K); } public static byte[] md5(byte[] data) { try { return MessageDigest.getInstance("md5").digest(data); } catch (final NoSuchAlgorithmException e) { throw new IllegalArgumentException(e); } }}
0 0
- HMAC
- HMAC
- hmac
- HMAC-MD5
- Openssl-HMAC
- HMAC算法
- HMAC简介
- HMAC算法
- Openssl HMAC
- HMAC-MD5
- HMAC加密算法
- HMAC加密算法
- python hmac
- HMAC 的理解
- MAC and HMAC
- Creating an HMAC CryptCreateHash()
- Android中hmac用法
- MAC and HMAC
- Lua语言学习<1>
- android导入项目时 R文件错误
- xml getResponseHeaders()函数
- (原)新花生壳内网版2.3 + Tomcat7 搭建自己的网站
- 月薪3万的程序员都避开了哪些坑
- hmac
- NDK编译Android字符界面的可执行程序
- 链表操作之快慢指针
- CentOS运行与控制后台进程的方法
- bzoj2151 种树
- Android之Application
- vector的reserve()和resize()
- 基于Android的CPU+GPU的异构编程开发,目前主要有以下几种平台
- 150. Evaluate Reverse Polish Notation