问题标签 [pbkdf2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 使用 Rfc2898DeriveBytes 在 C# 中实现 PBKDF2
伙计们,我正在尝试在 C# 中实现一个 PBKDF2 函数,该函数创建一个 WPA 共享密钥。我在这里找到了一些:http: //msdn.microsoft.com/en-us/magazine/cc163913.aspx似乎产生了一个有效的结果,但它的一个字节太短了......而且 PSK 值错误。
为了测试输出,我将其与此进行比较:http ://www.xs4all.nl/~rjoris/wpapsk.html或http://anandam.name/pbkdf2/
我确实找到了一种方法来让它与一个名为 Rfc2898DeriveBytes 的 C# 内置库一起工作。使用它,我得到一个有效的输出:
现在,我使用 Rfc2898DeriveBytes 的一个限制是“盐”必须是 8 个八位字节长。如果它更短,则 Rfc2898DeriveBytes 会引发异常。我在想我所要做的就是将盐(如果它更短)填充到 8 个字节,我会很好。但不是!我已经尝试了几乎所有填充与较短盐的组合,但我无法复制从上面这两个网站获得的结果。
所以底线是,这是否意味着 Rfc2898DeriveBytes 根本无法与短于 8 字节的源盐一起工作?如果是这样,是否有人知道我可以使用为 WPA 预共享密钥实现 PBKDF2 的任何 C# 代码?
.net - 让 .NET 中的 SlowAES 和 RijndaelManaged 类一起玩
我正在尝试使用 JavaScript 库SlowAES和 .NET 中的RijndaelManaged类设置 AES 加密/解密。
我在阅读这篇文章后选择了这种方法,Cheeso 已经设法让这两种加密方法一起发挥作用
“在我对 COM-wrapped-SlowAEs 的测试中,我使用了 CBC 模式,并且加密与 .NET 中的 RijndaelManaged 类完全兼容” - Cheeso
我从 Cheeso 的 Windows 脚本组件、最新的 slowaes 库中获取了 javascript 代码,并使用以下 javascript 脚本进行测试:
我得到以下输出:
我修改了MSDN 上的以下示例,以尝试匹配 C# 中的加密:
观察字节数组:
我已经尝试了托管 .NET 类的所有填充选项,但是我无法让加密的输出匹配。谁能帮我?
谢谢,
鲍勃
.net - PasswordDeriveBytes 与 Rfc2898DeriveBytes,已过时但速度更快
我正在研究基于从 SymmetricAlgorithm 继承的类(例如 TripleDes、DES 等)的加密功能。
基本上有两个选项可以为我的算法类生成一致的密钥和 IV,PasswordDeriveBytes
并且Rfc2898DeriveBytes
都继承自 DeriveBytes 抽象类。
该PasswordDeriveBytes.GetBytes()
方法在 .NET 框架中被标记为过时,而推荐使用 Rfc2898DeriveBytes.GetBytes(),因为它符合 PBKDF2 标准。但是,根据我的测试,GetBytes()
在 Rfc2898DeriveBytes 类中调用相同的方法几乎比在PasswordDeriveBytes
类中慢 15 倍,这导致了意外的 CPU 使用率(总是高于 50%)。
以下是一些测试数据:
- 迭代次数:100
- 算法类型:DES
- 原文:“我是测试密钥,请给我加密”
- 时间:
- PasswordDeriveBytes:99 毫秒
- Rfc2898DeriveBytes:1,373 毫秒
根据测试,Rfc2898DeriveBytes
生产环境中的不良性能是不能接受的。
以前有没有人注意到这个问题?任何解决方案我仍然可以使用标准解决方案而不会影响性能?使用过时的方法有任何风险(可以在未来的版本中删除)?
多谢你们!
编辑:
可能我发现问题出在哪里了……默认的迭代计数PasswordDeriveBytes
是100,而forRfc2898DeriveBytes
是1000。在我将它们更改为与1000相同的数字后,执行Rfc2898DeriveBytes
时间只有两倍。
security - 是否有使用 PBKDF2 作为密码哈希的标准?
和我一起对抗弱密码哈希。
PBKDF2 密码散列应该包含盐、迭代次数和散列本身,以便以后验证。PBKDF2 密码哈希是否有标准格式,例如 RFC2307 的 {SSHA}?BCRYPT 很棒,但 PBKDF2 更容易实现。
显然,没有规格。所以这是我的规格。
更新:http ://www.dlitz.net/software/python-pbkdf2/定义了一个crypt()
替代品。我更新了我的小规格以匹配他的,除了他的开头$p5k2$
不是{PBKDF2}
. (我需要从其他 LDAP 样式 {SCHEMES} 迁移)。
也就是说{PBKDF2}
,小写十六进制的迭代次数,$
编码的urlsafe_base64
盐,$
以及urlsafe_base64
编码的 PBKDF2 输出。salt 应该是 64 位,迭代次数至少应该是 1000 次,带有 HMAC-SHA1 输出的 PBKDF2 可以是任意长度。在我的实现中,默认情况下它总是 20 个字节(SHA-1 哈希的长度)。
密码在通过 PBKDF2 发送之前必须编码为 utf-8。没有关于它是否应该被规范化为 Unicode 的 NFC 的消息。
这种方案的iterations
暴力破解成本应该比 {SSHA} 高几倍。
key - 使用 MD5 从密码生成加密密钥?
我正在编写一个简单的文件加密程序。主要作为学术练习,但可能供将来认真使用。所有繁重的工作都由第三方库完成,但以安全的方式将各个部分组合在一起对于非密码学家来说仍然是一个相当大的挑战。基本上,我已经按照我认为应该的方式进行了所有工作。
我使用 128 位 AES 进行加密,密钥长度为 128 位。我希望用户能够输入可变长度的密码,所以我决定用 MD5 对密码进行哈希处理,然后使用哈希作为密钥。我认为这是可以接受的——密钥总是应该是秘密的,所以没有理由担心碰撞攻击。
现在我已经实现了这个,我遇到了几篇文章,表明这是一个坏主意。我的问题是:为什么?如果选择了一个好的密码,密码本身应该足够强大,除非通过非凡的(阅读:目前不可行的)蛮力努力,否则永远不会泄露密钥,对吧?我应该使用 PBKDF2 之类的东西来生成密钥,还是对于除了最极端的加密应用程序之外的所有应用程序来说都是过度杀伤力?
sha1 - PBKDF2-HMAC-SHA1
要为 WPA2 网络生成有效的成对主密钥,路由器使用 PBKDF2-HMAC-SHA1 算法。我知道 sha1 函数执行了 4096 次来导出 PMK,但是我对这个过程有两个问题。
原谅伪代码。
1) SHA1 函数的第一个实例的输入是如何格式化的?SHA1("network_name"+"network_name_length"+"network_password")
它是按该顺序格式化的,是网络名称、长度和密码的十六进制值还是直接的 ASCII?
然后从我收集到的 160 位摘要中,直接送入另一轮散列,无需任何额外的加盐。像这样: SHA1("160bit digest from last round of hashing") 上升并重复。
2) 一旦发生这种情况,输出的 4096 乘以 256 位将用作成对主密钥。我不明白的是,如果 SHA1 产生 160 位输出,那么算法如何达到密钥所需的 256 位?
谢谢您的帮助。
c# - 充气城堡 C# 中的 PBKDF2
我一直在搞乱 C# Bouncy Castle API 以找到如何进行 PBKDF2 密钥派生。
我现在真的是一头雾水。
我尝试通读 Pkcs5S2ParametersGenerator.cs 和 PBKDF2Params.cs 文件,但我真的不知道该怎么做。
根据我到目前为止所做的研究,PBKDF2 需要一个字符串(或 char[]),它是密码、盐和迭代计数。
到目前为止,我迄今为止最有希望和最明显的是 PBKDF2Params 和 Pkcs5S2ParametersGenerator。
这些似乎都不接受字符串或char []。
有没有人在 C# 中做过这个或对此有任何线索?或者也许有人在 Java 中实现了 BouncyCastle 并且可以提供帮助?
提前感谢很多:)
更新:我在 Bouncy Castle 找到了如何做到这一点。往下看答案:)
iphone - PBKDF2-HMAC-SHA256 Objective-C 实现
有人可以指出我在 Objective-C 中使用 HMAC-SHA256 生成密钥的 PBKDF2 实现。这是我稍后将用于 AES-CBC-Pad 加密的密钥生成过程的一部分。
提前致谢
cryptography - SHA1 在 PBKDF2 中用作散列函数是否仍然安全?
由于 SHA1 的密码分析取得了重大进展,因此应该逐步淘汰它以支持 SHA2(维基百科)。
然而,作为 PBKDF2 中的底层哈希函数,它基本上用作 PRNG。因此,使用 SHA1 作为 PBKDF2 的哈希应该仍然是安全的,对吧?