这里来看看PBKDF是什么东西,继续扫盲,进入一个新的领域真的是什么都盲点,不过一个个解决掉以后,将其串联起来的感觉真的好爽的,继续干。
百度说:**PBKDF2应用一个伪随机函数以导出密钥。**导出密钥的长度本质上是没有限制的(但是,导出密钥的最大有效搜索空间受限于基本伪随机函数的结构)。简单而言就是将salted hash进行多次重复计算,这个次数是可选择的。
salted hash:在密码学中,盐指的一串随机的数字。加盐的意思就是将这串数据作为一个单项函数的额外的输入。
为什么加盐,因为现在的hash不安全了,怎么加盐,这里有位zhen同学的文章写了。
站点登录需要输入用户名和密码,而密码属于个人敏感数据,应当只保存密码的单向哈希值。简单的哈希值,无法防止彩虹表攻击,使用基于口令的密钥派生算法PBKDF2可以解决这种问题。
在使用AES加密时,我们需要一个key来对加密的数据加密,那么这个key我们要使用什么来设定呢?是明文?还是什么?今天来讨论一种用来生成key的算法,PBKDF2。
总结一下:
PBKDF 全拼Password-Base Key Derivation Function,就是一个用来导出密钥的函数,经常用于生成加密的密码。
PBKDF2主要是通过一个伪随机函数导出密钥,导出的密钥的长度本质上是没有限制的,但是可以设置进行多次计算。将明文和一个盐值作为参数,最后生成密钥。加盐之后生成的密钥可以增加抗碰撞性,大大加强了抵御“彩虹表”的攻击能力。
用一个公式表示就是
DK = PBKDF2(PRF, Password, Salt, c, dkLen)
DK是PBKDF2算法产生的密钥
PRF是一个伪随机函数,例如HASH_HMAC函数,它会输出长度为hLen的结果
Password 是用来生成密钥的原文密码
Salt 是一系列用于生成密钥加密的盐值
c是迭代运算的次数
dkLen 是期望得到的密钥的长度
#import
CCKeyDerivationPBKDF( CCPBKDFAlgorithm algorithm,
const char *password,
size_t passwordLen,
const uint8_t *salt,
size_t saltLen,
CCPseudoRandomAlgorithm prf,
unsigned rounds,
uint8_t *derivedKey,
size_t derivedKeyLen)
__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0);
先介绍一下上边各个参数的用途
CCPBKDFAlgorithm algorithm:加密的类型,这里只有kCCPBKDF2一个可选值;
const char *password:加密明文的内容。
size_t passwordLen:加密明文的长度
const uint8_t *salt:加入的盐
size_t saltLen:盐的长度
CCPseudoRandomAlgorithm prf:随机算法的迭代
unsigned rounds:加密迭代的次数
uint8_t *derivedKey:最后生成输出密文的部分
size_t derivedKeyLen 生成输出密文的长度
DK的值由一个以上的block拼接而成。block的数量是dkLen/hLen的值。就是说如果PRF输出的结果比期望得到的密钥长度要短,则要通过拼接多个结果以满足密钥的长度:
DK = T1 || T2 || ... || Tdklen/hlen
而每个block则通过则通过函数F得到:
Ti = F(Password, Salt, c, i)
第一次,PRF会使用Password作为key,Salt拼接上编码成大字节序的32位整型的i作为盐值进行运算。
U1 = PRF(Password, Salt || INT_32_BE(i))
而后续的c-1次则会使用上次得到的结果作为盐值。
U2 = PRF(Password, U1)
...
Uc = PRF(Password, Uc-1)
在函数F里,PRF会进行c次的运算,然后把得到的结果进行异或运算,得到最终的值。
F(Password, Salt, c, i) = U1 ^ U2 ^ ... ^ Uc
小结:
PBKDF2算法通过多次hash来对密码进行加密。原理是通过password和salt进行hash,然后将结果作为salt在与password进行hash,多次重复此过程,生成最终的密文。此过程可能达到上千次,逆向破解的难度太大,破解一个密码的时间可能需要几百年,所以PBKDF2算法是安全的.
参考资料:
https://blog.csdn.net/knight20160302/article/details/82953712
https://www.jianshu.com/p/29601dd39672
https://zuopeng.blog.csdn.net/article/details/52078767