一、定义
密钥派生函数(Key Derivation Function)就是从一个密码产生出一个或多个密钥,具体就是从一个master key,password或者passphrase派生出一个或多个密钥,派生的过程使用PRF(Pseudo Random Function)。是一种实现key stretching(密钥延长算法,即一种更慢的哈希算法,用于将初始密钥转换成增强密钥,在计算过程中刻意延长时间或者消耗空间,这样有利于保护弱密码)的方法。
●最简单的KDF可以直接使用某种密码学散列算法,如:SHA256。将一个密码转换为一个散列值作为密钥。但易受字典攻击。
二、分类
根据派生源的不同,我们可以将密钥派生算法简单分为两种:
●从一个密钥派生出一个或多个新的密钥:HKDF(HMAC-based key derivation),基于HMAC的密钥派生算法
使用另一个随机数(salt)作为输入密钥,利用如HMAC-SHA256的HMAC算法对既有密钥派生新的密钥,并将salt与派生密钥一起存储,用于以后再次从这个既有密钥中派生出相同的派生密钥。salt通常不是私密的,并且可以重用。加盐(salt)可以防止彩虹表导致的密码泄露。
●从一个密码派生出一个或多个密钥:PBKDF2、Bcrypt、Scrypt、Argon2
三、两种密钥派生算法
1、PBKDF2(CPU-Hard algorithm)
是一种基于密钥派生出密钥的算法,需要消耗很多算力,可防止暴力破解加密。
passphrase -> [dklen, salt, c] > 1000] -> hash
DK = PBKDF2(PRF, Password, Salt, c, dkLen)
其中,
passphrase:用于用户认证或者加密程序的操作步骤
dklen:派生所产生的密钥的长度
salt:盐值是一串随机生成的比特
c:迭代的次数
DK:期望的密钥derived key
PRF(Pseudorandom function):伪随机数产生的密钥,如:hmac-sha256
2、Scrypt(Memory-Hard algorithm)
是一种password-base KDF算法,比起PBKDF2需要消耗更多的资源。Scrypt内部用的是PBKDF2算法,不过内部会长时间的维护一组比特数据,这些数据会在生成复杂的salt的过程中反复加密。
3、区别
总结:PBKDF2是算力消耗性的,Scrypt是资源消耗性的。
PBKDF2和Scrypt都是密钥派生函数(KDFs),它们通过故意减慢计算速度来实现密钥延长,特别是通过用一个可调参数来控制速度。不同之处在于,Scryp需要大量且可调整的内存量才能进行高效计算。这样能防止专有硬件ASIC/FPGA的暴力破解。
参考博客:
密码学学习笔记_01_密码学综述 - 知乎 (zhihu.com)
创建数字钱包(零)KDF 密钥派生算法 - 腾讯云开发者社区-腾讯云 (tencent.com)
密码学学习笔记_03_随机数与密钥派生 - 知乎 (zhihu.com)
版权归原作者 趣多多代言人 所有, 如有侵权,请联系我们删除。