2

Я реализую метод ValidateUser на пользовательском классе MembershipProvider. Я видел немало примеров этого, я ищу некоторые рекомендации о том, как правильно кодировать/хешировать/шифровать мои пароли. Я не специалист по криптографии, и я немного беспокоюсь о том, чтобы отклониться от реализации по умолчанию. Должен ли я просто скопировать соответствующий исходный код с SqlMembershipProvider или любой из них будет работать?MembershipProvider.ValidateUser для кодирования паролей

http://mattwrock.com/post/2009/10/14/Implementing-custom-Membership-Provider-and-Role-Provider-for-Authinticating-ASPNET-MVC-Applications.aspx

public override bool ValidateUser(string username, string password) 
{ 
    if(string.IsNullOrEmpty(password.Trim())) return false; 
    string hash = EncryptPassword(password); 
    User user = _repository.GetByUserName(username); 
    if (user == null) return false; 
    if (user.Password == hash) 
    { 
    User = user; 
    return true; 
    } 
    return false; 
} 

protected string EncryptPassword(string password) 
{ 
    // Produses an MD5 hash string of the password 
    //we use codepage 1252 because that is what sql server uses 
    byte[] pwdBytes = Encoding.GetEncoding(1252).GetBytes(password); 
    byte[] hashBytes = System.Security.Cryptography.MD5.Create().ComputeHash(pwdBytes); 
    return Encoding.GetEncoding(1252).GetString(hashBytes); 
} 

ASP.NET membership salt?

public string EncodePassword(string pass, string salt) 
{ 
    byte[] bytes = Encoding.Unicode.GetBytes(pass); 
    byte[] src = Encoding.Unicode.GetBytes(salt); 
    byte[] dst = new byte[src.Length + bytes.Length]; 
    Buffer.BlockCopy(src, 0, dst, 0, src.Length); 
    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length); 
    HashAlgorithm algorithm = HashAlgorithm.Create("SHA1"); 
    byte[] inArray = algorithm.ComputeHash(dst); 
    return Convert.ToBase64String(inArray); 
} 

ASP.NET membership salt?

private const int ITERATIONS = 10000; 
private const int SALT_SIZE = 32; 
private const int HASH_SIZE = 32; 

public void SaltAndHashPassword(string password, out byte[] salt, out byte[] hash) 
{ 
    Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes(password, SALT_SIZE, ITERATIONS); 

    salt = rdb.Salt; 
    hash = rdb.GetBytes(HASH_SIZE); 
} 

ASP.NET membership salt?

internal string GenerateSalt() 
{ 
    byte[] buf = new byte[16]; 
    (new RNGCryptoServiceProvider()).GetBytes(buf); 
    return Convert.ToBase64String(buf); 
} 

internal string EncodePassword(string pass, int passwordFormat, string salt) 
{ 
    if (passwordFormat == 0) // MembershipPasswordFormat.Clear 
     return pass; 

    byte[] bIn = Encoding.Unicode.GetBytes(pass); 
    byte[] bSalt = Convert.FromBase64String(salt); 
    byte[] bAll = new byte[bSalt.Length + bIn.Length]; 
    byte[] bRet = null; 

    Buffer.BlockCopy(bSalt, 0, bAll, 0, bSalt.Length); 
    Buffer.BlockCopy(bIn, 0, bAll, bSalt.Length, bIn.Length); 
    if (passwordFormat == 1) 
    { // MembershipPasswordFormat.Hashed 
     HashAlgorithm s = HashAlgorithm.Create("SHA1"); 
     // Hardcoded "SHA1" instead of Membership.HashAlgorithmType 
     bRet = s.ComputeHash(bAll); 
    } 
    else 
    { 
     bRet = EncryptPassword(bAll); 
    } 
    return Convert.ToBase64String(bRet); 
} 

ответ

1

Скачать BCrypt.Net. В отличие от типичного SHA-хеширования, которое слишком быстро заставляет зашифровать его легко и грубо. BCrypt работает медленнее из-за настраиваемого коэффициента работы, поэтому, будучи незаметным для пользователя, при попытке перебора силы 700 м клавиши в секунду вы просто не можете.

После того, как вы Bcrypt все, что вам нужно сделать, чтобы хэш является:

... 
private static readonly int BCRYPT_WORK_FACTOR = 10; 
string hashedPassword = BCrypt.Net.BCrypt.HashPassword(account.HashedPassword, BCRYPT_WORK_FACTOR); 
... 

и проверить пароль:

bool matched = BCrypt.Net.BCrypt.Verify(password, match.HashedPassword)) 

Больше информации здесь: http://www.danharman.net/2011/06/25/encrypting-hashing-passwords-for-your-website/

0

Я использую следующий:

var salt = Encoding.UTF8.GetBytes(this.Name); 
var bytes = Encoding.UTF8.GetBytes(password); 
return Convert.ToBase64String(new HMACSHA1(salt).ComputeHash(bytes)); 

 Смежные вопросы

  • Нет связанных вопросов^_^