hmac_hmacsha256 - CSDN
精华内容
参与话题
  • HMAC的原理和应用

    万次阅读 2014-02-26 10:54:03
     计算HMAC需要一个散列函数hash(可以是md5或者sha-1)和一个密钥key。用L 表示hash函数输出字符串长(md5是16),用B表示数据块的长度(md5和sha-1的分割数据块长都是64)。密钥key的长度可以小于

    转自:http://louisrb.blog.163.com/blog/static/756801292010014102633126/


      hmac的原理
      计算HMAC需要一个散列函数hash(可以是md5或者sha-1)和一个密钥key。用L 表示hash函数输出字符串长(md5是16),用B表示数据块的长度(md5和sha-1的分割数据块长都是64)。密钥key的长度可以小于等于数据 块长B,如果大于数据块长度,可以使用hash函数对key进行转换,结果就是一个L长的key。
          根据RFC 2316(Report of the IAB,April 1998),HMAC(散列消息身份验证码: Hashed Message Authentication Code)以及IPSec被认为是Interact安全的关键性核心协议。它不是散列函数,而是采用了将MD5或SHA1散列函数与共享机密密钥(与公钥 /私钥对不同)一起使用的消息身份验证机制。基本来说,消息与密钥组合并运行散列函数。然后运行结果与密钥组合并再次运行散列函数。这个128位的结果被 截断成96位,成为MAC.
      然后创建两个B长的不同字符串:
      innerpad = 长度为B的 0×36
      outterpad = 长度为B的 0×5C
      计算输入字符串str的HMAC:
      hash(key ^ outterpad, hash(key ^ innerpad, str))
      hmac的应用
      hmac主要应用在身份验证中,它的使用方法是这样的:
      1. 客户端发出登录请求(假设是浏览器的GET请求)
      2. 服务器返回一个随机值,并在会话中记录这个随机值
      3. 客户端将该随机值作为密钥,用户密码进行hmac运算,然后提交给服务器
      4. 服务器读取用户数据库中的用户密码和步骤2中发送的随机值做与客户端一样的hmac运算,然后与用户发送的结果比较,如果结果一致则验证用户合法
      在这个过程中,可能遭到安全攻击的是服务器发送的随机值和用户发送的hmac结果,而对于截获 了这两个值的黑客而言这两个值是没有意义的,绝无获取用户密码的可能性,随机值的引入使hmac只在当前会话中有效,大大增强了安全性和实用性。大多数的 语言都实现了hmac算法,比如php的mhash、python的hmac.py、java的MessageDigest类,在web验证中使用 hmac也是可行的,用js进行md5运算的速度也是比较快的。

    展开全文
  • HMAC算法

    千次阅读 2018-04-18 20:37:10
    HMAC算法 HMAC(Hash Message Authentication Code),中文名“散列消息鉴别码”,主要是利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。 HMAC算法作用 数据完整性校验; 身份认证; HMAC ...

    HMAC算法

      HMAC(Hash Message Authentication Code),中文名“散列消息鉴别码”,主要是利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。
    这里写图片描述

    HMAC算法作用

    1. 数据完整性校验;
    2. 身份认证;

    HMAC VS HASH

      HMAC基于HASH,但是与HASH相比,又多了密钥,因此安全性上要比相同的HASH要高。

    HMAC VS MAC

      MAC算法相当于方法论,HMAC算法是MAC的一种实现,利用HASH函数生成摘要。

    HMAC工具类

    import javax.crypto.KeyGenerator;
    import javax.crypto.Mac;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    
    public class HMacUtils {
        private static final char[] digital = "0123456789ABCDEF".toCharArray();
        private static final String ALGORITHM = "HmacSHA256";
    
        /**
         * 功能:将Byte[]转换为16进制字符串
         * 
         * @return String 密钥
         **/
        public static String convertToHexStr(byte[] bytes) throws Exception {
            if (bytes == null || bytes.length <= 0) {
                throw new Exception("bytes is empty!");
            }
            char[] result = new char[bytes.length * 2];
            for (int i = 0; i < bytes.length; i++) {
                result[i * 2] = digital[(bytes[i] & 0xf0) >> 4];
                result[i * 2 + 1] = digital[bytes[i] & 0x0f];
            }
            return new String(result);
        }
    
        /**
         * 功能:将16进制字符串转换为Byte[]
         * 
         * @param hexString 密钥
         **/
        public static byte[] convertToBytes(String hexString) {
            if (hexString == null || hexString.equals("")) {
                return null;
            }
            hexString = hexString.toUpperCase();
            int length = hexString.length() / 2;
            char[] hexChars = hexString.toCharArray();
            byte[] d = new byte[length];
            for (int i = 0; i < length; i++) {
                int pos = i * 2;
                d[i] = (byte) (HMacUtils.charToByte(hexChars[pos]) << 4 | HMacUtils.charToByte(hexChars[pos + 1]));
            }
            return d;
        }
    
        private static byte charToByte(char c) {
            return (byte) "0123456789ABCDEF".indexOf(c);
        }
    
        /**
         * 功能:生成密钥
         * 
         * @return String 密钥
         **/
        public static String getSecretKey() throws Exception {
            KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
            SecretKey key = keyGenerator.generateKey();
            byte[] keyBytes = key.getEncoded();
            return HMacUtils.convertToHexStr(keyBytes);
        }
    
        /**
         * 功能:加签
         * 
         * @param content
         *            待加签的内容
         * @param secretKey
         *            密钥
         * @param charset
         *            字符编码,默认为UTF-8
         * @return String 加签后的字符串
         **/
        public static String doSign(String content, String secretKey, String charset) throws Exception {
            byte[] bytes = content.getBytes(null == charset ? "UTF-8" : charset);
            byte[] key = HMacUtils.convertToBytes(secretKey);
            SecretKeySpec signingKey = new SecretKeySpec(key, ALGORITHM);
            Mac mac = Mac.getInstance(ALGORITHM);
            mac.init(signingKey);
            mac.update(bytes);
            byte[] ss = mac.doFinal();
            return HMacUtils.convertToHexStr(ss);
        }
    
        /**
         * 功能:验签
         * 
         * @param content
         *            待加签的内容
         * @param signature
         *            已有签名
         * @param secretKey
         *            密钥
         * @param charset
         *            字符编码,默认为UTF-8
         * @return String 加签后的字符串
         **/
        public static boolean doCheck(String content, String signature, String secretKey, String charset) {
            String newSignature = null;
            try {
                newSignature = HMacUtils.doSign(content, secretKey, charset);
            } catch (Exception e) {
    
            }
            return signature.equals(newSignature);
        }
    
    }

    参考:

    1. https://blog.csdn.net/zbw18297786698/article/details/53586956
    展开全文
  • HMAC的图解

    万次阅读 2018-09-23 16:30:23
    一 什么是HMAC HMAC是一种使用单向散列函数来构造消息认证码的方法,其中HMAC中的H就是Hash的意思。 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。

    二 HMAC步骤

    1 图例

    2 图解

    1 密钥填充

    如果密钥比单向散列函数分组长度要短,就需要在末尾填充0,直到其长度达到单向散列函数的分组长度为止。

    如果密钥比分组长度要长,则要用单向散列函数求出密钥的散列值,然后将这个散列值用作HMAC的密钥。

    2 填充后的密钥与ipad的XOR

    将填充后的密钥与被称为ipad的比特序列进行XOR运算。ipad是将00110110这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中ipad的i是inner的意思。

    XOR运算所得到的值,就是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为ipadkey。

    3 与消息组合

    随后,将ipadkey与消息组合,也就是将和密钥相关的比特序列(ipadkey)附加在消息的开头。

    4 计算散列值

    将3的结果输入单向散列函数,并计算出散列值。

    5 填充后的密钥与opad的XOR

    将填充后的密钥与被称为opad的比特序列进行XOR运算,opad是将01011100这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中opad的o是outer的意思。

    XOR运算所得到的结果也是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为opadkey。

    166.png

    6 与散列值组合

    将4的散列值拼在opadkey后面。

    7 计算散列值

    将6的结果输入单向散列函数,并计算出散列值,这个散列值就是最终的MAC值。

    通过上述流程可以看出,最后得到的MAC值,一定是一个和输入的消息以及密钥都相关的长度固定的比特序列。

     

    展开全文
  • Hmac简单理解与应用

    万次阅读 2017-04-10 12:03:06
    HMAC的简单理解和应用~


    MAC算法结合了MD5和SHA算法的优势,并加入密钥的支持,是一种更为安全的消息摘要算法。
    MAC(Message Authentication Code,消息认证码算法)是含有密钥的散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加入了密钥。

    我们也常把MAC称为HMAC(keyed-Hash Message Authentication Code)。
    MAC算法主要集合了MD和SHA两大系列消息摘要算法。

    MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;

    SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512五种算法。


    以上是网上最流传最便于理解的HMAC的说法,可以简单的理解为就MD5或者SHA提取摘要,然后用MAC进行秘钥加密

    这么说是没有错的,而我要补充说明的是这里的秘钥问题,因为HMAC的本意秘钥是要随机生成的,而不是客户端与服务器之前约定好的。

    HMAC在实践中它应该是这么用的:

    (1)客户端向服务器发起请求,访问登录页面.这时服务器生成一个密钥,把这个密钥存储在session之中,然后将密钥返回给客户端.

    (2)客户端填写登录表单,点击提交后,运行HMAC算法,根据密钥将用户信息加密后post到服务器.

    (3)服务器读取数据库中的密码,用HMAC将密码和session中的密钥进行加密产生密码的密文,将密文与用户提交的进行比较.

    但是我看到大多数的实现都没有随机生成秘钥,而是实现约定好秘钥,在客户端与服务端使用,这样做把HMAC的安全性打了折扣。

    这里给出以下HMAC的核心实现,不管秘钥是约定好的,还是随机生成的,都使用到了如下的核心方法

    具体的使用还是要看具体情况

    public static String encodeHmacSHA1(byte[] data, byte[] key) throws Exception {             
    	        SecretKey secretKey = new SecretKeySpec(key, "HmacSHA1"); 
    	        Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
    	        mac.init(secretKey);  
    	        byte[] digest = mac.doFinal(data);          
    	        return new HexBinaryAdapter().marshal(digest);
    	        //转为十六进制的字符串输出
    	    }

    //生成秘钥
    	 public static byte[] initHmacSHA1Key() throws NoSuchAlgorithmException {  
    	        KeyGenerator generator = KeyGenerator.getInstance("HmacSHA1");  //假设使用到的是HmacSHA1方法
    	        SecretKey secretKey = generator.generateKey();
    	        byte[] key = secretKey.getEncoded();
    		return key;
    	    }


    代码比较简单,因为java都为我们封装好了~










    展开全文
  • HMAC概念简介

    千次阅读 2020-04-05 10:38:45
    HMAC运算利用hash算法,以一个消息M和一个密钥K作为输入,生成一个定长的消息摘要作为输出。HMAC算法利用已有的Hash函数,关键问题是如何使用密钥。 HMAC的密钥长度可以是任意大小,如果小于n(hash输出值...
  • HMAC简介

    千次阅读 2013-02-06 16:22:50
    HMAC简介 背景 在开放的计算和通信世界(比如Internet)里,我们会使用不可靠的媒介传输和存储信息。如何校验这些信息的完整性(integrity)就变得极其重要。基于密钥作完整性校验的方法常称为MAC(message ...
  • HMAC 使用

    2019-07-14 16:55:24
    HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。 HMAC的应用 hmac主要应用在身份验证中,它的使用方法是这样的: (1) 客户端发出登录请求...
  • hmac 算法秘钥

    千次阅读 2019-06-06 14:06:59
    博客园 首页 新随笔 联系 订阅 管理 随笔 - 127文章 - 3评论 - 18 信息摘要算法之五:HMAC算法分析与实现 MAC(Message Authentication Code,消息认证码算法)是含有密钥散列...HMAC算法首先它是基于信息摘...
  • 从零入门HMAC-SHA256

    2020-04-15 15:18:24
    文章目录1.HMAC算法1.1 HMAC算法简介1.2 HMAC算法定义1.3 HMAC算法步骤2. SHA-256算法2.1 SHA-256算法简介2.2 SHA-256算法描述2.3 SHA-256算法步骤3. HAMAC-SHA256算法定义3.1 HMAC-SHA256算法描述3.2 HMAC-SHA256...
  • Hash 是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。...如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入...
  • HMAC 原理

    千次阅读 2018-06-07 14:21:37
    定义HMAC需要一个加密用散列函数(表示为H,可以是MD5或者SHA-1)和一个密钥K。我们用B来表示数据块的字节数。(以上所提到的散列函数的分割数据块字长B=64),用L来表示散列函数的输出数据字节数(MD5中L=16,SHA-1...
  • HMAC

    2019-07-22 18:20:19
    介绍文档及C实现 http://www.ietf.org/rfc/rfc2104.txt Network Working Group H. Krawczyk Request for Comments: 2104 IBM ......
  • hmac

    2015-10-24 01:04:33
    HMAC 需要一个加密用散列函数(表示为 H)和一个密钥 K。我们假设 H 是 一个将数据块用一个基本的迭代压缩函数来加密的散列函数。我们用 B 来表示数据块的字长。(以上提到的散列函数的分割数据块字长 B = 64),用 ...
  • hmac hmac.new 我们有HTTPS,还需要什么? 当您谈论基于REST的API的安全性时,人们通常会指向HTTPS。 借助HTTPS,您可以使用每个人都熟悉的方法轻松保护您的服务免遭窥视。 但是,当您需要更高级别的安全性或HTTPS...
  • 开宗明义,米扑科技在使用腾讯云的API接口签名中,按照官方示例开发PHP、Python的接口,经常会提示签名错误123456789{ "Response": { "Error": { "Code": "...
  • 阿里云设备登录一机一密和一型一密都需要用到HMAC-MD5算法 什么是 HMAC-MD5? 1、比如你和对方共享了一个密钥K,现在你要发消息给对方,既要保证消息没有被篡改,又要能证明信息确实是你本人发的,那么就把原信息...
  • C++ HMAC SHA1

    热门讨论 2020-07-28 16:03:01
    C++的HMAC_SHA1加密算法源码,你自己可以做成动态库,由VC、VB或者C#调用。
  • hmac的python实现

    2019-01-06 17:22:56
    Hash-based message authentication code,利用...可以查看python的内置模块hmac.py的源码来学习hmac的用法 举例: 一、 1 import hmac 2 import hashlib 3 mac = hmac.new('secret_key','message_be_crypted',h...
  • HMAC算法及其应用

    千次阅读 2020-05-22 11:02:32
    HMAC算法及其应用MACHMACHMAC的应用HMAC实现举例 MAC 在现代的网络中,身份认证是一个经常会用到的功能,在身份认证过程中,有很多种方式可以保证用户信息的安全,而MAC(message authentication code)就是一种常用的...
  • 【kong系列八】之HMAC认证hmac-auth插件

    千次阅读 2017-08-18 16:54:56
    hmac 插件 构造签名header Authorization: hmac username="userhmac", algorithm="hmac-sha1", headers="X-Date Content-md5", signature="LqkezHTAuk/Sk3RTbguHHYZGt/8=" X-Date: Mon, 31 Jul 2017 07:23:02 GMT ...
1 2 3 4 5 ... 20
收藏数 30,906
精华内容 12,362
关键字:

hmac