PBKDF2

这里来看看PBKDF是什么东西,继续扫盲,进入一个新的领域真的是什么都盲点,不过一个个解决掉以后,将其串联起来的感觉真的好爽的,继续干。

PBKDF2是什么?

百度说:**PBKDF2应用一个伪随机函数以导出密钥。**导出密钥的长度本质上是没有限制的(但是,导出密钥的最大有效搜索空间受限于基本伪随机函数的结构)。简单而言就是将salted hash进行多次重复计算,这个次数是可选择的。

salted hash:在密码学中,盐指的一串随机的数字。加盐的意思就是将这串数据作为一个单项函数的额外的输入。

为什么加盐,因为现在的hash不安全了,怎么加盐,这里有位zhen同学的文章写了。
在这里插入图片描述

站点登录需要输入用户名和密码,而密码属于个人敏感数据,应当只保存密码的单向哈希值。简单的哈希值,无法防止彩虹表攻击,使用基于口令的密钥派生算法PBKDF2可以解决这种问题。

在使用AES加密时,我们需要一个key来对加密的数据加密,那么这个key我们要使用什么来设定呢?是明文?还是什么?今天来讨论一种用来生成key的算法,PBKDF2。

总结一下:

PBKDF 全拼Password-Base Key Derivation Function,就是一个用来导出密钥的函数,经常用于生成加密的密码。

PBKDF2主要是通过一个伪随机函数导出密钥,导出的密钥的长度本质上是没有限制的,但是可以设置进行多次计算。将明文和一个盐值作为参数,最后生成密钥。加盐之后生成的密钥可以增加抗碰撞性,大大加强了抵御“彩虹表”的攻击能力。

怎么用PBKDF2的算法

用一个公式表示就是

DK = PBKDF2(PRF, Password, Salt, c, dkLen)

DK是PBKDF2算法产生的密钥

PRF是一个伪随机函数,例如HASH_HMAC函数,它会输出长度为hLen的结果

Password 是用来生成密钥的原文密码

Salt 是一系列用于生成密钥加密的盐值

c是迭代运算的次数

dkLen 是期望得到的密钥的长度

在这里插入图片描述

举个栗子

#import <CommonCrypto/CommonKeyDerivation.h>

  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

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TrustZone_Hcoco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值