既然有PBKDF2那么就肯定有PBKDF1,那么他们两个的区别是什么呢? PBKDF2是PKCS系列的标准之一,具体来说他是PKCS#5的2.0版本,同样被作为RFC 2898发布。 所以被PBKDF2替换了。 在2017年发布的RFC 8018(PKCS #5 v2.1)中,是建议是用PBKDF2作为密码hashing的标准。 PBKDF2的工作流程 PBKDF2实际上就是将伪散列函数PRF(pseudorandom function)应用到输入的密码、salt中,生成一个散列值,然后将这个散列值作为一个加密key,应用到后续的加密过程中 详解PBKDF2的key生成流程 上面一小节,我们以一种通俗易懂的方式告诉大家,PBKDF2到底是怎么工作的。 我们上面介绍了PBKDF2是一个生成衍生key的函数,作为一个函数,那么就有输入和输出,我们先看下PBKDF2的定义: DK = PBKDF2(PRF, Password, Salt, c, dkLen
其中一种算法是 PBKDF2(Password-Based Key Derivation Function 2),用于从密码推导出加密密钥。 让我们以 Java Service为例,深入了解 PBKDF2 的工作原理。 什么是PBKDF2? PBKDF2 是一种算法,旨在通过为加密等加密操作创建加密密钥来加强密码的安全性。 Java Service Example 让我们来看一个利用 PBKDF2 进行加密和解密的 Java 服务示例。下面的代码示例代表了这项服务,我们将逐步对其进行分解讲解。 它采用 PBKDF2 从主密码和盐中提取密钥。 了解 PBKDF2 的工作原理有助于开发人员创建安全的应用程序。所提供的 Java service示例演示了如何使用 PBKDF2 生成加密密钥并确保数据的安全加密和解密。
两种密钥派生算法 PBKDF2 (CPU-Hard algorithm) PBKDF2是基于密码派生出密钥的算法,需要消耗很多算力,为了是防止暴力破解加密。 Scrypt (Memory-Hard algorithm) Scrypt 也是一种 password-base KDF 算法,比起 PBKDF2 需要消耗更多的资源,从而有效防止了专有硬件 ASIC/ Scrypt 内部用的还是 PBKDF2 算法,不过内部会长时间地维护一组比特数据,这些数据会在生成复杂的 salt 的过程中反复加密(Salsa20,一种流密码[2])得到。 区别 一言以蔽之,PBKDF2是算力型,而Scrypt是资源消耗型的。 密钥派生原理 PBKDF2 运行的原理 passphrase -> [dklen, salt, c] > 1000] -> hash DK = PBKDF2(PRF, Password, Salt,
其它加密算法 现在,通常推荐使用 bcrypt 或 PBKDF2 这两种算法来对密码进行加密。 PBKDF2实际上默认采用并推荐sha256,然后再配合10000次运算得出的结果。 参考标准:rfc6070,rfc2898 我们看一下django中关于PBKDF2的代码:utils/crypto.py def pbkdf2(password, salt, iterations, dklen 当然,如果你自己编写PBKDF2函数,你可以将salt存储在任意字段。只要让每个用户都不一样就行了。 我个人偏向于使用PBKDF2,下面的参考资料中,或许也会给你答案。
dtool 0.5.0 发布了 关于dtool dtool 是一个辅助开发命令行工具集 是RUST写的噢 完整项目介绍 升级点 支持Pbkdf2 大小写转换 (upper, lower, title, pascal, snake, shouty snake, kebab) 增加hash算法 (crc, blake2b) 示例 Sub command Desc Example Remark Since pbkdf2 Pbkdf2 $ dtool pbkdf2 -a sha2_256 -s 0x646566 -i 2 -l 256\ 0x6162630x51a30556d0d133d859d3f3da86f861b7b12546c4f9a193eb
RustCrypto 发布 password-hash crate 此 crate 提供针对密码的 traits 和类型,使用这个 crate 的 crates 有: argon2 pbkdf2 scrypt verify_password 这个函数可以使用多种密码算法的 hash,但是可以一次性验证,代码如下: use password_hash::PasswordHash; use argon2::Argon2; use pbkdf2 ::Pbkdf2; use scrypt::Scrypt; let hash_string = load_hash_string_for_user(...); // e.g. invalid password hash"); // Trait objects for algorithms to support let algs = &[Argon2::default(), Pbkdf2
Using -iter or -pbkdf2 would be better. 这种情况下,可以再加个参数 -pbkdf2 -iter 10000 如下: cat ${original_file} | gzip -c | openssl enc -aes-256-cbc -salt -pbkdf2 -iter 1000 -pass pass:${encrypt_passwd} -out ${encrypted_file} -pbkdf2 和 -iter 1000 选项则告诉 OpenSSL 使用 PBKDF2 密钥派生函数,并且进行1000次迭代,使得暴力破解更加困难。
PBKDF2加密算法,全程是Password-Based Key Derivation Function。 PBKDF2加密算法就是牺牲了时间来换取安全,一个明文的密码+随机的盐,然后哈希散列加密后存储起来,这是我们前面说的(二、加盐salted)。把这个过程重复100次,得到的结果存储起来。 但是,scrypt在算法层面只要没有破绽,它的安全性应该高于PBKDF2。 五、请使用bcrypt!请使用bcrypt!请使用bcrypt! bcrypt经过了很多安全专家的仔细分析,使用在以安全著称的OpenBSD中,一般认为它比PBKDF2更能承受随着计算能力加强而带来的风险。
以下是一个改进后的命令: openssl enc -aes-256-cbc -salt -pbkdf2 -iter 10000 -in plaintext.txt -out ciphertext.bin -pbkdf2 和 -iter 10000 选项则告诉 OpenSSL 使用 PBKDF2 密钥派生函数,并且进行10000次迭代。这大大增加了从密码生成密钥的计算成本,使得暴力破解更加困难。 解密文件 要解密文件,可以使用以下命令: openssl enc -aes-256-cbc -d -pbkdf2 -iter 10000 -in ciphertext.bin -out plaintext.txt
PBKDF2提高安全系数主要采用“添加随机盐(Salt)”和“多次哈希”这两种手段。 基于PBKDF2的密码哈希可以直接调用KeyDerivation类型的如下这个静态方法Pbkdf2来完成。 在调用上面这个Pbkdf2方法的时候,我们可以利用prf参数指定采用的伪随机算法(PRF:Pseudo-random Function)。 Pbkdf2方法的其他参数分别表示待哈希的密码、随机盐、迭代次数(次数越大、安全系数越大)和最终生成哈希值的字节数。 图5 采用PBKDF2生成的密码哈希
Django如何储存密码 Django通常使用PBKDF2来提供灵活的密码储存系统。 通常,Django以SHA256的哈希值使用PBKDF2算法,由NIST推荐的一种密码伸缩机制。这对于大多数用户都很有效:它非常安全,需要大量的计算来破解。 例如: bcrypt2a12 增加工作因数 PBKDF2 和bcrypt 算法使用大量的哈希迭代或循环。这会有意拖慢攻击者,使对哈希密码的攻击更难以进行。 例如,增加PBKDF2算法默认使用的迭代次数: 创建django.contrib.auth.hashers.PBKDF2PasswordHasher的子类: from django.contrib.auth.hashers 修改PBKDF2迭代次数之后,密码也会被升级。
一些网友在 Sharoglazov 的动态下针对该实验进行了讨论,一位 ID 为 Unblvr 的用户指出,造成这个结果的原因可能在于: ZIP 使用 PBKDF2,如果输入太大,它会 hash 输入 尝试使用 SHA1 对第一个密码进行 hash,并将十六进制摘要解码为 ASCII... :) 在启用 AES-256 模式生成受密码保护的 ZIP 存档时 ,如果密码太长,ZIP 格式会使用 PBKDF2 更多的技术见解可参见 Wikipedia 上 PBKDF2 的 HMAC collisions 小节:https://en.wikipedia.org/wiki/PBKDF2#HMAC_collisions “当使用 HMAC 作为其伪随机函数时,PBKDF2 有一个有趣的特性。
其中就包括:Bcrypt,PBKDF2,Scrypt,Argon2。为什么这些 hash 算法能保证密码存储的安全性?因为他们足够慢,恰到好处的慢。这么说不严谨,只是为了给大家留个深刻的映像:慢。 Bcrypt,Scrypt,PBKDF2 这些慢 hash 算法是目前最为推崇的 password encoding 方式,好奇心驱使我思考了这样一个问题:慢 hash 算法真的安全吗? PBKDF2 被设计的很简单,它的基本原理是通过一个伪随机函数(例如 HMAC 函数),把明文和一个盐值作为输入参数,然后按照设置的计算强度因子重复进行运算,并最终产生密钥。 你会不会担心密码泄露后,{bcrypt},{pbkdf2},{scrypt},{sha256} 此类前缀会直接暴露密码的编码方式?其实这个考虑是多余的,因为密码存储的依赖算法并不是一个秘密。 参考 Password Hashing: PBKDF2, Scrypt, Bcrypt core-services-password-encoding show me the code spring security
格式会委托给BCryptPasswordEncoder加密类 {bcrypt}$2a$10$iMz8sMVMiOgRgXRuREF/f.ChT/rpu2ZtitfkT5CkDbZpZlFhLxO3y // {pbkdf2 }格式会委托给Pbkdf2PasswordEncoder加密类 {pbkdf2}cc409867e39f011f6332bbb6634f58e98d07be7fceefb4cc27e62501594d6ed0b271a25fd9f7fc2e User.builder().username("yuqiyu") //.password("{noop}123456") .password("{pbkdf2 所创建的用户:yuqiyu,采用pbkdf2方式进行密码编码。
ivBytes: 16 }; let {privateKey, salt, iv} = keythereum.create(params); keythereum可以产生私钥,以及后面加密私钥所用的PBKDF2 const password = "Hello,Ethereum" const options = { kdf: "pbkdf2", cipher: "aes-128-ctr", }, id: uuid.v4(), // random 128-bit UUID version: 3 }; keyObject.crypto.kdf = "pbkdf2
ecdsa.PrivKeyFromBytes(ecdsa.S256(), keyBytes) return pub.ToAddress().String() } 1.2 pbkdf2.Key() 生成秘钥函数 PBKDF2 用户密码采用 PBKDF2 算法存储,比较安全。 PBKDF2 函数的语法定义 DK = PBKDF2(PRF, Password, Salt, c, dkLen ,Hash algorithm) PRF 是一个伪随机函数,例如 HASH_HMAC 以下为使用助记词生成私钥的代码 package pbkdf2 import ( "crypto/rand" "crypto/sha512" "golang.org/x/crypto/pbkdf2
其中就包括:Bcrypt,PBKDF2,Scrypt,Argon2。为什么这些 hash 算法能保证密码存储的安全性?因为他们足够慢,恰到好处的慢。这么说不严谨,只是为了给大家留个深刻的映像:慢。 Bcrypt,Scrypt,PBKDF2 这些慢 hash 算法是目前最为推崇的 password encoding 方式,好奇心驱使我思考了这样一个问题:慢 hash 算法真的安全吗? PBKDF2 被设计的很简单,它的基本原理是通过一个伪随机函数(例如 HMAC 函数),把明文和一个盐值作为输入参数,然后按照设置的计算强度因子重复进行运算,并最终产生密钥。 我们在数据库中需要这么存储数据: {bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG {noop}password {pbkdf2 你会不会担心密码泄露后,{bcrypt},{pbkdf2},{scrypt},{sha256} 此类前缀会直接暴露密码的编码方式?其实这个考虑是多余的,因为密码存储的依赖算法并不是一个秘密。
PBKDF2算法 PBKDF2算法,即Password-Based Key Derivation Function 2。PBKDF2简单而言就是将加盐Hash进行多次重复计算,这个次数是可选择的。 bcrypt经过了很多安全专家的仔细分析,使用在以安全著称的OpenBSD中,一般认为它比PBKDF2更能承受随着计算能力加强而带来的风险。 但是,scrypt在算法层面只要没有破绽,它的安全性应该高于PBKDF2和bcrypt。
这类方案的常用算法有三种: 1)PBKDF2(Password-Based Key Derivation Function) PBKDF2简单而言就是将salted hash进行多次重复计算,这个次数是可选择的 bcrypt经过了很多安全专家的仔细分析,使用在以安全著称的OpenBSD中,一般认为它比PBKDF2更能承受随着计算能力加强而带来的风险。 但是,scrypt在算法层面只要没有破绽,它的安全性应该高于PBKDF2和bcrypt。
编译的时候可能出现的问题解决方法: #只拿一种常见的错误做例子,有时候可能会出现很多种这样的提示 lib/kcp/crypt.go:14:2: cannot find package "golang.org/x/crypto/pbkdf2 " in any of: /usr/lib/go-1.7/src/golang.org/x/crypto/pbkdf2 (from $GOROOT) /root/workspace/src /golang.org/x/crypto/pbkdf2 (from $GOPATH) #意思是缺少这种包,然后记住提示的地址,比如上面的golang.org/x/crypto/pbkdf2,有时候也会提示的 然后再使用命令go get golang.org/x/crypto/pbkdf2命令安装一下就行了。