赞
踩
密钥派生函数(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
是一种基于密钥派生出密钥的算法,需要消耗很多算力,可防止暴力破解加密。
- 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
是一种password-base KDF算法,比起PBKDF2需要消耗更多的资源。Scrypt内部用的是PBKDF2算法,不过内部会长时间的维护一组比特数据,这些数据会在生成复杂的salt的过程中反复加密。
总结:PBKDF2是算力消耗性的,Scrypt是资源消耗性的。
PBKDF2和Scrypt都是密钥派生函数(KDFs),它们通过故意减慢计算速度来实现密钥延长,特别是通过用一个可调参数来控制速度。不同之处在于,Scryp需要大量且可调整的内存量才能进行高效计算。这样能防止专有硬件ASIC/FPGA的暴力破解。
参考博客:
密码学学习笔记_01_密码学综述 - 知乎 (zhihu.com)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。