【问题标题】:PBKDF2 and C# questionsPBKDF2 和 C# 问题
【发布时间】:2015-02-07 18:04:49
【问题描述】:

我正在尝试理解这个密钥派生函数,我有一些问题

1) 在 C# 中,似乎 Rfc2898DeriveBytes 使用 SHA1 实现它,但我想尝试使用 SHA512 来提高安全性。如何在 C# 中将 SHA512 用于 PBKDF2?

2) 我读过关于哈希冲突的文章,但我还不明白,那么盐和哈希的正确长度是多少才能获得良好的安全性?

【问题讨论】:

  • 您所做的哪些研究表明,在通过 SHA1 执行密钥派生函数时,执行 SHA512 会为您提供更好的安全性?适用于 SHA1 与 SHA512 的所有弱点均不适用于此处的使用方式。
  • 哦,对不起,我没有进行任何研究,但是 SHA1 使用 20 字节,SHA512 使用 64,PBKDF2 有你决定的长度,但我读到你不能选择随机长度,因为你必须取你的 Salt 长度考虑到因为有一种叫做碰撞的东西。所以我在这里有点困惑。也许不是更安全的 SHA512 但有更多字节作为输出,我认为这会迫使你使用更大的 PBKDF2 长度,这对我来说似乎更安全。

标签: c# security hash pbkdf2


【解决方案1】:

在 C# 中,似乎 Rfc2898DeriveBytes 使用 SHA1 实现它,但我想尝试使用 SHA512 以提高安全性。如何在 C# 中将 SHA512 用于 PBKDF2?

Rfc2898DeriveBytes 现在在 .NET Framework 4.7.2 的构造函数中接受 HashAlgorithmName

对于旧版本的 .NET:

不幸的是,这只是Rfc2898DeriveBytes 实现的一个限制,它不允许你指定散列函数。 SHA512 可能是矫枉过正,许多人会认为 SHA1 可能仍然可以安全使用。然而,很多人确实使用 SHA256。您将不得不找到另一个实现。 Microsoft 制作了另一个名为 CLR Security 的库,它扩展了 System.Security.Cryptography 命名空间。

它所做的其中一件事是使用 Microsoft 的 CNG API。它确实提供了支持指定散列函数的 PBKDF2 实现,包括 SHA512。你可以find it on Codeplex。唯一的缺点是,它不能在 XP 或 Server 2003 上运行,因为 CNG 是在 Windows Vista / Server 2008 中引入的。

我读过关于哈希冲突的文章,但我还不明白,那么盐和哈希的正确长度是多少才能获得良好的安全性?

你的盐应该相当长。一个很好的例子可能是盐可能与散列函数的输出大小相同,因此对于 SHA512,您将使用 64 字节的盐。一般来说,你的盐应该是一个足够大的值,它不能轻易被暴力破解。它也应该是随机的,而不是一些“用户”数据,比如用户名。

【讨论】:

  • 假设我使用带有 SHA1 的默认 C# PBKDF2 实现,我决定使用 64 字节盐和 128 字节输出,算法使用 SHA1,即 20 字节输出用于我的 64 字节盐......是这对吗?我可以使用已经衍生的盐和 SHA512 作为盐吗?这提高了安全性?
  • @Ralstlin 我会阅读这篇博文,它会解决很多问题,我认为:security.blogoverflow.com/2013/09/about-secure-password-hashing
猜你喜欢
  • 1970-01-01
  • 2018-11-05
  • 2012-03-18
  • 2018-05-11
  • 2018-10-31
  • 2011-05-29
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多