是否取代FormsAuthentication.HashPasswordForStoringInConfigFile?

Moo*_*Moo 38 .net forms-authentication

升级到.Net 4.5后,我现在收到"System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile已过时"的警告,建议使用成员资格API.

这对于新项目来说非常好并且很好,但是在这个阶段(存在用户数据和散列密码),我不能很好地改变到具有可能不同的散列方式的自定义成员资格提供者.

对于像这样的问题,推荐的前进方向是什么?继续使用"过时"调用显然不是建议的路径,它是否被"仅使用成员资格API"以外的其他东西所取代?

小智 53

这是SHA1变体的解决方案.

     public static string GetSwcSHA1(string value)
     {
        SHA1 algorithm = SHA1.Create();
        byte[] data = algorithm.ComputeHash(Encoding.UTF8.GetBytes(value));
        string sh1 = "";
        for (int i = 0; i < data.Length; i++)
        {
            sh1 += data[i].ToString("x2").ToUpperInvariant();
        }
        return sh1;
     }
Run Code Online (Sandbox Code Playgroud)

对于MD5,您只需将算法更改为:

MD5 algorithm = MD5.Create();
Run Code Online (Sandbox Code Playgroud)

希望你不介意,只需要在上面添加你的代码的VB.NET变体:

    Public Shared Function CreateHash(saltAndPassword) As String
        Dim Algorithm As SHA1 = SHA1.Create()
        Dim Data As Byte() = Algorithm.ComputeHash(Encoding.UTF8.GetBytes(saltAndPassword))
        Dim Hashed As String = ""

        For i As Integer = 0 To Data.Length - 1
            Hashed &= Data(i).ToString("x2").ToUpperInvariant()
        Next

        Return Hashed
    End Function
Run Code Online (Sandbox Code Playgroud)


Ant*_*rds 9

对于像这样的问题,推荐的前进方向是什么?继续使用"过时"调用显然不是建议的路径,它是否被"仅使用成员资格API"以外的其他东西所取代?

纯粹在.NET Framework中,最好的方法(你已经排除了)是改变所有内容,以便通过PBKDF2,Bcrypt或Scrypt对密码进行哈希处理.PBKDF2由.NET提供,由Rfc2898DeriveBytes类提供.

第二种最好的方法是最终得到两个"版本"的密码:

  • 版本0可能是旧的HashPasswordForStoringInConfigFile,但您可以批量,离线,更新版本1并在任何人窃取它们之前删除那些旧的哈希值,并且您最终会在交易新闻中获得可疑的90年代复古密码哈希值.
  • 版本1,它是现有HashPasswordForStoringInConfigFile值的PBKDF2!即你采用当前讨厌的旧哈希,并使用新的随机盐和大量迭代对PBKDF2进行处理,并存储结果.然后,当用户想要登录时,您将其密码提供给@RichardBažant编写的代码,因此您将获得HashPasswordForStoringInConfigFile返回的内容,然后将PBKDF2应用于该结果!
    • 即它实际上是Rfc2898DeriveBytes(HashPasswordForStoringInConfigFile(密码)),PerUserSalt,YourIterations)
  • 版本2,具有版本1哈希的用户升级到.除"version"之外的所有列都是相同的,但在计算并验证版本1之后,您计算Rfc2898DeriveBytes(密码),PerUserSalt,YourIterations)并将版本1散列替换为版本2散列(并将版本更改为2,当然).

第三种最好的方法是第二种最好的方法,但只有版本1.小心,这种方式是DCC2疯狂 - 你继续将旧输出包装在更新的算法中

在这两种情况下,您都将PBKDF2-HMAC-SHA-1结果存储在数据库中,因此您需要:

  • 密码哈希(BINARY(20)) - 即PBKDF2输出.
  • 你的盐(BINARY(16),由RNGCryptoServiceProvider类为每个用户生成)
  • 可选:PBKDF2迭代次数(INT,以数万次开始,直到服务器在最大负载下受CPU限制之前;随着硬件升级而增加)
    • 这允许您在用户每次输入(正确)密码时透明地提高安全级别.首先验证密码是否正确,然后以更高的迭代次数重新散列它
  • 可选:"版本"(TINYINT),以便以后升级到另一个算法更容易,因为您可以同时激活多个版本.

对于版本1或版本2更新算法的PS,Jither创建了一个能够支持PBKDF2-HMAC-SHA256,PBKDF2-HMAC-SHA512等的.NET库; 我的Github存储库包含一个带有一组合理测试向量的变体.