• 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 
    
      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

  • 相关阅读:
    深度学习_2_数据处理
    数组基本使用——java SE
    数据结构之单链表和双链表(封装常用方法以及实例)添加元素方法,查找元素方法,删除元素方法等等
    Nginx安装、配置
    基于python-django协同过滤豆瓣电影推荐系统
    这几个点让我买了Watch Ultra
    Mac--WebStorm-前端环境配置(node.js+yarn)Taro框架使用
    2020年第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海)
    Prometheus+grafana监控--初探
    小龙虾优化算法COA求解不闭合SD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)
  • 原文地址:https://blog.csdn.net/weixin_45264425/article/details/127097233