C# System.Web.Helpers和迭代?

C# System.Web.Helpers和迭代?,c#,asp.net,passwords,cryptography,C#,Asp.net,Passwords,Cryptography,ASP.net有一个用于哈希和验证密码的类。它似乎在运行中生成salt并将其作为密码散列的一部分存储 我的问题是,随着计算机变得越来越强大,需要增加迭代次数以帮助防止暴力攻击,如何增加现有密码的迭代次数 迭代次数硬编码到辅助对象中。将其更改为较大的数字将增加新密码的迭代次数,但也会在验证密码时单方面增加所有密码的迭代次数。这不会中断旧密码的密码验证吗 为了规划未来,您不想存储salt和迭代次数吗 另外,是否可以通过执行额外的迭代来加强现有密码哈希,或者迭代必须作为一个操作进行 不,您不能增强现有

ASP.net有一个用于哈希和验证密码的类。它似乎在运行中生成salt并将其作为密码散列的一部分存储

我的问题是,随着计算机变得越来越强大,需要增加迭代次数以帮助防止暴力攻击,如何增加现有密码的迭代次数

迭代次数硬编码到辅助对象中。将其更改为较大的数字将增加新密码的迭代次数,但也会在验证密码时单方面增加所有密码的迭代次数。这不会中断旧密码的密码验证吗

为了规划未来,您不想存储salt和迭代次数吗

另外,是否可以通过执行额外的迭代来加强现有密码哈希,或者迭代必须作为一个操作进行

不,您不能增强现有密码-更改哈希迭代次数将破坏现有验证。除非要强制所有当前用户创建新密码,否则不要更改哈希设置。如果你是加密而不是散列,这是可能的,但不要做加密

我们使用一个用于salt和hash的公共助手库,它允许我们调整每个项目的hash迭代次数,因此我们可以任意增加迭代次数。如果您担心将来的打样,这可能会让您在将来扩大规模

通常,我们使用SHA256、MD5等算法组合进行大约100次salt和哈希运算。迭代次数和哈希序列是单个项目设置的一部分-我们不会将其与salt和哈希结果一起存储在数据库中

编辑:

现在我突然想到,一般来说,只要新哈希例程的第一部分与现有哈希例程相同,就可以对现有密码哈希进行多次哈希,使其与更新的哈希功能同步。例如,如果您当前哈希10次并将其更改为100次,则可以将现有值再哈希90次并更新数据库。如果加密实现不是一路跳跃,我希望10+90次迭代散列产生与100次散列相同的结果

然而,如果你把这个过程搞砸了,你可能会破坏所有用户的现有密码。除非我真的需要,否则我不愿意实现这样的东西

不,您不能增强现有密码-更改哈希迭代次数将破坏现有验证。除非要强制所有当前用户创建新密码,否则不要更改哈希设置。如果你是加密而不是散列,这是可能的,但不要做加密

我们使用一个用于salt和hash的公共助手库,它允许我们调整每个项目的hash迭代次数,因此我们可以任意增加迭代次数。如果您担心将来的打样,这可能会让您在将来扩大规模

通常,我们使用SHA256、MD5等算法组合进行大约100次salt和哈希运算。迭代次数和哈希序列是单个项目设置的一部分-我们不会将其与salt和哈希结果一起存储在数据库中

编辑:

现在我突然想到,一般来说,只要新哈希例程的第一部分与现有哈希例程相同,就可以对现有密码哈希进行多次哈希,使其与更新的哈希功能同步。例如,如果您当前哈希10次并将其更改为100次,则可以将现有值再哈希90次并更新数据库。如果加密实现不是一路跳跃,我希望10+90次迭代散列产生与100次散列相同的结果


然而,如果你把这个过程搞砸了,你可能会破坏所有用户的现有密码。除非我真的需要,否则我不愿意实现这样的东西。

该助手实际上存储了一个前缀,指示所使用的算法和迭代次数,因此,如果算法在将来更改,旧密码仍然可以验证

我们考虑将默认值从1000提高到更高。然而,当我们这样做时,新的CPU命中率是不可接受的。消费者设备需要1000000次迭代是可以的,因为你根本不在乎你的平板电脑或手机是否需要0.5秒登录。但是当一个网页需要相当长的时间来处理登录请求时。。好您不希望用户仅通过登录即可关闭服务器:


不幸的是,1000次迭代仍然是提高安全性而不是直接使用salt和hash并保持web服务器响应性的最佳折衷办法。

该助手实际上存储了一个表示算法的前缀 thm和使用的迭代次数,因此如果算法在未来发生变化,仍然可以验证旧密码

我们考虑将默认值从1000提高到更高。然而,当我们这样做时,新的CPU命中率是不可接受的。消费者设备需要1000000次迭代是可以的,因为你根本不在乎你的平板电脑或手机是否需要0.5秒登录。但是当一个网页需要相当长的时间来处理登录请求时。。好您不希望用户仅通过登录即可关闭服务器:


不幸的是,1000次迭代仍然是提高安全性而不是直接使用salt和hash并保持web服务器响应性的最佳折衷办法。

您说存储salt和迭代计数对于未来规划更好,这是正确的,只需看看PHP的

不仅迭代计数被称为成本,而不是确切的迭代计数,而是基于相同的概念和salt与派生密钥一起存储,算法也被存储,以防将来需要替换算法

System.Web.Helpers.Crypto类使用PBKDF2对密码进行哈希运算,该类在内部使用哈希算法对密码进行定义次数的迭代哈希运算。由于内部操作都是不可逆的,并且迭代的段不是最终的段,因此执行额外的哈希不起作用。整个密码需要从其原始明文源重新设置

通常,重新设置密码的过程在用户下次再次登录时发生。此时,系统可以确定是否需要重新设置用户密码,并在需要时进行相应操作。这不仅避免了运行可能导致停机的主要重新刷新操作的成本,而且也是唯一一次用户的明文密码再次可用。如果在不久的将来有可能出现漏洞,而不是在漏洞完全暴露时,则应重新设置密码,因为此时可能已经太晚了


如果数据安全是一个问题,也是对未来的规划,我建议您使用另一个类,它允许自定义迭代次数,并将所有相关数据存储在派生密钥/散列密码本身中。

您说存储salt和迭代计数对于未来规划更好,这是正确的,只需看看PHP

不仅迭代计数被称为成本,而不是确切的迭代计数,而是基于相同的概念和salt与派生密钥一起存储,算法也被存储,以防将来需要替换算法

System.Web.Helpers.Crypto类使用PBKDF2对密码进行哈希运算,该类在内部使用哈希算法对密码进行定义次数的迭代哈希运算。由于内部操作都是不可逆的,并且迭代的段不是最终的段,因此执行额外的哈希不起作用。整个密码需要从其原始明文源重新设置

通常,重新设置密码的过程在用户下次再次登录时发生。此时,系统可以确定是否需要重新设置用户密码,并在需要时进行相应操作。这不仅避免了运行可能导致停机的主要重新刷新操作的成本,而且也是唯一一次用户的明文密码再次可用。如果在不久的将来有可能出现漏洞,而不是在漏洞完全暴露时,则应重新设置密码,因为此时可能已经太晚了


如果数据的安全性是一个问题,同时也是对未来的规划,我建议您使用另一个类,可能是您自己的,它允许自定义迭代次数,并将所有相关数据存储在派生密钥/散列密码本身中。

p.s.请参阅讨论进一步阅读100次是远远不够的。使用多种算法的组合也是可疑的。请参阅附页。参阅讨论以便进一步阅读100次是远远不够的。使用多种算法的组合也是可疑的。请参阅Levi,在查看代码时,我无法找到它存储前缀的位置,该前缀包含有关mash方法或迭代次数的信息。在HashPassword和VerifyHashedPassword方法中,迭代次数似乎都是硬编码的。我们谈论的是同一个库,还是有一个我没有看到的更新版本?或者这是Salt和/或Subkey的一部分?@Sam,如果你查看这个类的注释。您将看到已输入代码以将密码保存为版本0。它将规范定义为:带HMAC-SHA1的PBKDF2、128位salt、256位子密钥、1000次迭代。我假设,如果您创建了更多版本,您可能会对代码进行一些修改,以适应不同版本的密码以及不同的迭代次数。版本号i
s只是在派生密钥/密码版本0的第一个字节处保存为单个字节,版本字节为0x00。@CPUTerminator-谢谢,我现在在开头看到了额外的字节。Levi,在查看代码时,我找不到它存储前缀的位置,该前缀包含有关mash方法或迭代次数的信息。在HashPassword和VerifyHashedPassword方法中,迭代次数似乎都是硬编码的。我们谈论的是同一个库,还是有一个我没有看到的更新版本?或者这是Salt和/或Subkey的一部分?@Sam,如果你查看这个类的注释。您将看到已输入代码以将密码保存为版本0。它将规范定义为:带HMAC-SHA1的PBKDF2、128位salt、256位子密钥、1000次迭代。我假设,如果您创建了更多版本,您可能会对代码进行一些修改,以适应不同版本的密码以及不同的迭代次数。版本号只需在派生密钥/密码版本0的第一个字节保存为一个字节,该版本的版本字节为0x00。@CPUTerminator-谢谢,我现在在开头看到了额外的字节。登录时重新哈希的好主意!登录时重新哈希的好主意!