-1

使用以下函数,您可以使用 bcrypt 加密输入字符串。

public static string CreatePassword(string password)
{
    // no need to provide a Salt value since bcrypt does that automatically
    byte[] PasswordBytes = Encoding.ASCII.GetBytes(password);

    return Crypter.Blowfish.Crypt(PasswordBytes);
}

这使用了很棒的CryptSharp,但是你如何根据这个函数返回的哈希来验证用户输入呢?

我在库中找不到任何功能来执行此操作。

我能想到的最好方法是使用以下方法:

public static bool ValidatePassword(string password, string passwordHash)
{
    // crypt the entered password
    string Crypted = Crypter.Blowfish.Crypt(Encoding.ASCII.GetBytes(password));

    // compare the crypted password against the value in the database
    if (String.Compare(Crypted, passwordHash, false) != 0) return false;

    return true;
}

唯一的问题是盐值不会相同,因此这些值几乎总是不一致。

4

1 回答 1

0

盐应该是唯一的。以避免数据库密码破解相同的密码。您应该使用密码存储盐,如果用户登录,您应该使用相同的盐检查用户输入和密码

在第二个参数中,您可以提供自定义盐

 string salt = Crypter.Blowfish.GenerateSalt(20);
 Crypter.Blowfish.Crypt(PasswordBytes,salt);

对于验证,您可以使用它

public static bool ValidatePassword(string inputPassword, string storedPassword, string salt)
        {
            // crypt the entered password and stored password
            string CryptedInput = Crypter.Blowfish.Crypt(Encoding.ASCII.GetBytes(inputPassword), salt);
            string CryptedPassword = Crypter.Blowfish.Crypt(Encoding.ASCII.GetBytes(storedPassword), salt);

            // compare the crypted passwords
            return string.Equals(CryptedInput, CryptedPassword);
        }
于 2016-09-13T14:53:17.773 回答