在密码学中,密钥导出函数(KDF)使用伪随机函数从秘密值(eg.主密钥)导出一个或多个密钥。KDF可用于将密钥扩展到更长的密钥或获得所需格式的密钥(eg.将作为Diffie-Hellman密钥交换的结果的组元素转换为用于AES的对称密钥)。密钥加密哈希函数是用于密钥推导的伪随机函数的流行示例。
KDFs的使用:
          密钥导出函数通常与非秘密参数一起使用,以从公共秘密值导出一个或多个密钥。这样的使用可以防止获得派生密钥的攻击者学习关于输入秘密值或任何其他导出密钥的有用信息;也可以使用KDF来确保派生密钥具有其他期望的属性,诸如在某些特定加密系统中避免“弱密钥”。
KDFs最常见的用途是将密码散列的方法来密码验证,我们将非秘密参数称之为salt。KDFs也通常用作多方密钥协商协议的组成部分,这些关键推导函数的示例包括KDF1和ANSI X9.42中的类似功能。特别的,基于HMAC的提取和扩展密钥导出功能(HKDF) 是一种简单的基于HMAC的KDF,可用作各种协议和应用程序中的构建块。
我们下面针对密钥延伸(key stretching)对KDF进行下一步的描述:
          KDF也用于从秘密密码或密码短语导出密钥的应用程序,密码通常不具有直接用作加密密钥的所需属性。在这样的应用中,通常建议将密钥导出功能故意缓慢,以阻止对密码或密码输入值的暴力攻击或字典攻击。

这种使用可以表示为DK = KDF(Key,Salt,Iterations),其中DK是派生密钥,KDF是密钥导出函数,Key是原始密钥或密码,Salt是作为密码盐的随机数,Iterations是指子功能的迭代次数。使用派生密钥代替原始密钥或密码作为系统的密钥。盐的值和迭代次数(如果不固定)与散列密码一起存储或以加密消息的明文形式发送。

暴力攻击的难度随着迭代次数的增加而增加。迭代计数的实际限制是用户不愿容忍登录计算机或看到解密消息的可察觉延迟。使用salt可以防止攻击者预先计算派生密钥的字典。

类似的,当下还有另一种方法叫做密钥强化(key strengthening),使用随机盐扩展键,但是不像密钥延伸一样可以安全地删除salt。这将强制攻击者和合法用户对salt值执行强力搜索。
---------------------
作者:sjrGCkym
来源:CSDN
原文:https://blog.csdn.net/sjrgckym/article/details/78195845
版权声明:本文为博主原创文章,转载请附上博文链接!

PBKDF2

编辑

 
DK = PBKDF2(P,S,c,dkLen)
可选项: RPF 基本伪随机函数(hLen表示伪随机函数输出的字节长度)
输入:
  P 口令,一字节串
  S 盐值,字节串
c 迭代次数,正整数
dkLen 导出密钥的指定字节长度,正整数,最大约(2^32-1)*hLen
输出: DK 导出密钥,长度dkLen字节

密钥导出函数(Key derivation function)的更多相关文章

  1. 写给开发人员的实用密码学(三)—— MAC 与密钥派生函数 KDF

    目录 一.MAC 消息认证码 MAC 与哈希函数.数字签名的区别 MAC 的应用 1. 验证消息的真实性.完整性 2. AE 认证加密 - Authenticated encryption 3. 基于 ...

  2. Mysql导出函数、存储过程

    下面是导出存储过程的代码 1 # mysqldump -u 数据库用户名 -p -n -t -d -R 数据库名 > 文件名 其中,-d 表示--no-create-db, -n表示--no-d ...

  3. DLL模块例1:使用.def模块导出函数,规范修饰名称,显示连接调用dll中函数

    以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html ...

  4. 导出函数__declspec(dllexport)

    一般而言,动态链接库中定义有两种函数:导出函数(export function)和内部函数(internal function). 导出函数可以被其它模块调用,内部函数在定义它们的DLL程序内部使用. ...

  5. DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中加上__declspec(dllexport): 另外一种方式是:采用模块定义(.def)文件声明,(.def)文件为链接器提供了有关被链接 ...

  6. 在DLL编程中,导出函数为什么需要extern "C"

    转自:http://blog.csdn.net/zhongjling/article/details/8088664 一般来讲,在DLL编程过程中,对于导出的函数前 都需要加入 extern “C”, ...

  7. DLL声明导出函数的两种方式

    DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport):另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出.属 ...

  8. (转)DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的两种方式(dllexport与.def文件)http://www.cnblogs.com/enterBeijingThreetimes/archive/2010/08/04/1792 ...

  9. 【转】DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的两种方式(dllexport与.def文件) DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中加上__declspec(dllexport):另外一种方式是:采用模块定义 ...

随机推荐

  1. Google Authenticator(谷歌身份验证器)

    <!DOCTYPE html>Google Authenticator(谷歌身份验证器) ] Google Authenticator(谷歌身份验证器) Google Authentica ...

  2. 使用Verilog描述RTL图

    题目要求 分别用两种方式表达此电路: 1)在一个模块中用两个过程来表达: 2)用顶层文件和例化语句的形式来表达. 给出下面RTL图的verilog描述. 1)纯过程语句描述 2)纯连续赋值语句描述 参 ...

  3. linux 下安装 mysql 并配置 python 开发环境

    1.安装 mysql ,安装过程中将提示设置 root 用户的密码,默认可以设置为 rootadmin . $ sudo apt-get install mysql-server 2.安装 mysql ...

  4. JAVA 中 if和while的区别

    while和if本身就用法不同,一个是循环语句,一个是判断语句. if 只做判断,判断一次之后,便不会再回来了while 的话,循环,直到结果为false,才跳出来 链表的结构,要一直读下去,直到读完 ...

  5. Beam概念学习系列之Pipeline 数据处理流水线

    不多说,直接上干货! Pipeline 数据处理流水线 Pipeline将Source PCollection ParDo.Sink组织在一起形成了一个完整的数据处理的过程. Beam概念学习系列之P ...

  6. matlab遍历文件制作自己的数据集 .mat文件

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9115788.html 看到深度学习里面的教学动不动就是拿MNIST数据集,或者是IMGPACK ...

  7. uwsgi服务启动、关闭、重启操作

    1.      添加uwsgi相关文件 在之前的文章跟讲到过centos中搭建nginx+uwsgi+flask运行环境,本节就基于那一次的配置进行说明. 在www中创建uwsgi文件夹,用来存放uw ...

  8. Shell脚本检测程序,如果挂了就重启程序

    脚本如下: #!/bin/sh #要检查的进程名 PROGRESS_NAME="heihu_server" #----------------------------------- ...

  9. bzoj 4771: 七彩树

    Description 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节 点的颜色为c[i].如果c[i]=c[j],那么我们认为点i和点j拥有 ...

  10. js面向对象3

    1.this的使用 核心:在js中,this表示当前对象,“谁”调用了当前函数,“this”就指向了“谁” 语法: Function 类(){ this.属性=值; } 例1.在构造器中,使用this ...