密钥导出函数KDF

密钥导出函数KDF

KDF概述

KDF全称(Key derivation function) 密钥导出函数。
密码学中,密钥导出函数是指使用伪随机函数从主密钥master_key中导出一个或多个密钥key。KDF可用于将密钥扩展到更长的密钥或获得所需格式的密钥。密钥加密哈希函数是用于密钥推导的伪随机函数的流行示例。

KDF执行方法

实现 key stretching [1] 的方法,具体就是从一个 master key,password 或者 passphrase 派生出一个或者多个密钥,派生的过程,使用PRF(Pseudo Random Function 伪随机函数)可以是某种哈希算法。

  • [Key stretching]
    密钥延长算法(一种更慢的哈希算法),用于将初始密钥转换成增强密钥,在计算过程中刻意延长时间或者消耗空间,这样有利于保护弱密码。

密钥派生算法

  1. PBKDF2 (CPU-Hard algorithm)
    原理介绍
    PBKDF2简单而言就是将salted hash进行多次重复计算,这个次数是可选择的。
    PBKDF2是基于密码派生出密钥的算法,需要消耗很多算力,为了是防止暴力破解加密。
  2. Scrypt (Memory-Hard algorithm)
    Scrypt 也是一种 password-base KDF 算法,比起 PBKDF2 需要消耗更多的资源,从而有效防止了专有硬件 ASIC/ FPGA 的暴力破解。Scrypt 内部用的还是 PBKDF2 算法,不过内部会长时间地维护一组比特数据,这些数据会在生成复杂的 salt 的过程中反复加密(Salsa20,一种流密码)得到。网上流行说,以太坊的PoW共识算法是利用Scrypt实现的,但事实上,以太坊自己实现了一套哈希算法,叫做Ethash。

简而言之,PBKDF2是算力型,而Scrypt是资源消耗型算法。

KDFs的使用

我们下面针对密钥延伸( key stretching )对KDF进行下一步的描述:

KDF也用于从秘密密码或密码短语导出密钥的应用程序,密码通常不具有直接用作加密密钥的所需属性。在这样的应用中,通常建议将密钥导出功能故意缓慢,以阻止对密码或密码输入值的暴力攻击或字典攻击。

这种使用可以表示为DK = KDF(Key,Salt,Iterations),
其中DK是派生密钥;
KDF是密钥导出函数;
Key是原始密钥或密码;
Salt是作为密码盐的随机数;
Iterations是指子功能的迭代次数。

使用派生密钥代替原始密钥或密码作为系统的密钥。盐的值和迭代次数(如果不固定)与散列密码一起存储或以加密消息的明文形式发送。

暴力攻击的难度随着迭代次数的增加而增加。迭代计数的实际限制是用户不愿容忍登录计算机或看到解密消息的可察觉延迟。使用salt可以防止攻击者预先计算派生密钥的字典。

KDF流程图

Extraction-then-Expansion(E-E) Key Derivation Procedure
密钥导出函数KDF

参考地址

https://blog.csdn.net/sjrgckym/article/details/78195845
https://www.cnblogs.com/mengsuenyan/p/13160157.html#toc
https://www.jianshu.com/p/9b579b80afa4

上一篇:Django之密码加密


下一篇:解决ThinkPHP的Create方法失效而没有提示错误信息的问题