简单地计算hash_func(key+msg)以获得MAC(消息认证码)被认为是不安全的。建议改用HMAC算法,例如HMAC-SHA256或HMAC-SHA3-512或其他安全MAC算法。

什么是HMAC?

HMAC= Hash-based Message Authentication Code (MAC code,使用加密哈希函数计算):

HMAC(key, msg, hash_func) -> hash

结果MAC代码是混合了密钥的消息散列。它具有哈希的密码特性:不可逆、抗冲突等。
hash_func可以是任何加密哈希函数,如SHA-256、SHA-512、RIPEMD-160、SHA3-256或BLAKE2s。
HMAC用于消息真实性、消息完整性,有时用于密钥推导

密钥导出函数(key derivation function,KDF)

密钥导出函数(KDF)是将可变长度密码转换为固定长度密钥(位序列)的函数:

function(password) -> key

作为一个非常简单的KDF函数,我们可以使用SHA256:只需对密码进行哈希。不要这样做,因为这是不安全的。简单哈希容易受到字典攻击
作为更复杂的KDF函数,您可以通过使用称为“salt”的随机值计算HMAC(salt、msg、SHA256)来派生密码,该值与派生密钥一起存储,稍后用于从密码中再次派生同一密钥。
使用HKDF(基于HMAC的密钥推导)进行密钥推导的安全性低于现代KDF,因此专家建议使用更强的密钥推导函数,如PBKDF2、Bcrypt、Scrypt和Argon2。我们将在后面讨论所有这些KDF函数。

HMAC 计算- 举例

要更好地了解HMAC及其计算方法,请尝试以下在线工具:Free Online HMAC Generator / Checker Tool (MD5, SHA-256, SHA-512) - FreeFormatter.com

计算HMAC('sample message', '12345', 'SHA256'):

HMAC('sample message', '12345', 'SHA256') ='ee40ca7bc90df844d2f5b5667b27361a2350fad99352d8a6ce061c69e41e5d32'

在Python中,我们可以按如下方式计算HMAC代码(使用hashlib和hmac库):

import hashlib, hmac, binasciidef hmac_sha256(key, msg):return hmac.new(key, msg, hashlib.sha256).digest()key = b"12345"
msg = b"sample message"
print(binascii.hexlify(hmac_sha256(key, msg)))

运行上面的代码示例:***HMAC SHA256 Examples in Python - Python Repl - Replit

上面的代码将计算并打印预期的HMAC代码(如我们前面的示例中所示):

ee40ca7bc90df844d2f5b5667b27361a2350fad99352d8a6ce061c69e41e5d32

HMAC和密钥导出(HMAC and Key Derivation)相关推荐

  1. RFC5869翻译 HMAC-based Extract-and-Expand Key Derivation Function (HKDF)

    HMAC-based Extract-and-Expand Key Derivation Function (HKDF) Abstract 该文档描述了一个简单的基于HMAC的密钥导出方法,它可以用来 ...

  2. C语言KDF密钥源代码,区块链中的数学-SM2算法与KDF密钥导出函数

    本节讲了SM2算法的KDF函数,从一般用途到SM2特定实现 ## 写在前面 上一节说了[sm2概述和加密过程](https://learnblockchain.cn/article/1516)实现, ...

  3. 一种更优雅的蓝牙配对技术 - Cross-transport key derivation (CTKD)

    一种更优雅的蓝牙配对技术 - Cross-transport key derivation (CTKD)   蓝牙CTKD是蓝牙4.2版本引入的一种交叉传输密钥派生的安全机制,全称 Cross-tra ...

  4. 【量子通信到底是怎么回事?】量子通信的概念(光的偏振特性)、量子密钥分发(quantum key distribution,QKD)

    文章目录 前言 I .量子通信的概念 1.1 是否存在一种密码,从理论上讲是无法破译的? 1.2 量子通信的概念 1.3 光的偏振特性 1.4 光线的振动方向和最后的光栅(就是那个起过滤作用的栅栏)既 ...

  5. SM2使用的密钥导出函数

    SM2中使用了一种KDF,可以参见SM2标准文档第4部分公钥加密算法的5.4.3节密钥派生函数. 函数:K = KDF (Z, klen) 功能:SM2使用的的密钥导出函数 输入参数: Z:KDF所需 ...

  6. SM9使用的密钥导出函数

    SM9使用的密钥导出函数是H1和H2函数的前四步,详情参见在第2部分 数字签名算法 5.4.2节密码杂凑函数. 两个密钥导出函数的差异在SM3杂凑时的首字节不同,H1和H2分别使用0x01和0x02作 ...

  7. Password-Based Key Derivation Functions (PBKDF)

    概述 KDF是一种确定性算法,用于从秘密值(如密码)派生加密密钥材料.家族中的每个PBKDF由选择的伪随机函数(PRF)和固定的迭代计数(记为C)定义.执行PBKDF的输入包括密码(记为P).盐(记为 ...

  8. Authenticator 备份密钥/导出

    在各大互联网平台中对于账户的安全性不容小嘘,gmail v2ex 这些在使用的时候为了提高安全性经常会推荐绑定 google auth,用户登录或者其他操作的时候一个 token验证. 原理 Goog ...

  9. git提示(拷贝密钥问题)“Load key /home/devid/.ssh/id_rsa: bad permissions”

    今天在Linux虚拟机系统中将windows上的.ssh文件夹直接拷贝进去,并测试github的连通性 ssh -T git@github.com 却提示 devid@Linux ~/workspac ...

最新文章

  1. 每周算法讲堂 floyd
  2. 【技术综述】图像与CNN发家简史,集齐深度学习三巨头
  3. 高并发C/S的TCP版本golang实现
  4. 从 C++ 到 Objective-C 的快速指南 【已翻译100%】
  5. 跟我一起学WCF(2)——利用.NET Remoting技术开发分布式应用
  6. CSS具有最高优先级 !important
  7. redis安装、配置和启动
  8. WebService开发常用功能详解
  9. SqlAlchemy ORM
  10. matlab中的方波信号图片_哈工大、哈工程MATLAB被禁用,这个国产软件号称可替代!...
  11. 【SPPS学习一】 SPSS-26软件下载与安装步骤详解
  12. Android编译预制过高版本app导致编译错误解决
  13. 机器学习算法(十):线性回归之最小二乘法
  14. 【XSY3331】东非大裂谷(结论,DP)
  15. 医学病理图片(SVS格式)的格式转换与显示——python实现
  16. 计算机二级wps知识点,计算机二级MS office和WPS office如何备考?
  17. 浏览器、html、css面试题(一)
  18. 数据备份与数据还原 ----数据库的异地容灾策略
  19. Vue el-input 使用伪元素插入间隔符
  20. BUUCTF 每天10道Misc Day4

热门文章

  1. 台式计算机屏幕扩展,台式机屏幕如何扩展
  2. TheOpenGroupDPBoK个人认证计划
  3. 我在职场上的所表达出来的个性
  4. 30 周年,Linux 成功的真正原因是什么?
  5. JS 无形装逼,最为致命
  6. poj2391 Ombrophobic Bovines 拆点连边要注意
  7. 合作小红书探店博主需要注意什么?流程是怎样的?
  8. Android 6.0系统读写文件问题( Permission denied)
  9. Python中复数取.imag的问题
  10. 近期有面试的必看!带你手撸红黑树,终获offer