2017-01-25 10 views
4

私は自分のサイトでパスワードをハッシュするためにSHA1を使いました。私はASP.NETアイデンティティに移動しようとしています。私は古いパスワード(ASP.NET Identity default Password Hasher, how does it work and is it secure?)を確認することができる方法が見つかりました:私のカスタムApplicationUserManagerでSHA1(ASP.NET ID)で作成したパスワードハッシュを書き換えるにはどうすればよいですか?

public class CustomPasswordHasher : IPasswordHasher 
{ 
//.... 
    public static bool VerifyHashedPassword(string hashedPassword, string password) 
    { 
    byte[] buffer4; 
    if (hashedPassword == null) 
    { 
     return false; 
    } 
    if (password == null) 
    { 
     throw new ArgumentNullException("password"); 
    } 
// Old hash verification 
    using (SHA1Managed sha1 = new SHA1Managed()) 
    { 
     var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(password)); 
     var sb = new StringBuilder(hash.Length * 2); 

     foreach (byte b in hash) 
     { 
      sb.Append(b.ToString("x2")); 
     } 

     if(hashedPassword == sb.ToString()) return true; 
     else return false; 
    } 

// Identity hash verification 
    byte[] src = Convert.FromBase64String(hashedPassword); 
    if ((src.Length != 0x31) || (src[0] != 0)) 
    { 
     return false; 
    } 
    byte[] dst = new byte[0x10]; 
    Buffer.BlockCopy(src, 1, dst, 0, 0x10); 
    byte[] buffer3 = new byte[0x20]; 
    Buffer.BlockCopy(src, 0x11, buffer3, 0, 0x20); 
    using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(password, dst, 0x3e8)) 
    { 
     buffer4 = bytes.GetBytes(0x20); 
    } 
     return ByteArraysEqual(buffer3, buffer4); 
    } 
//.... 
} 

を、私はPasswordHasherプロパティを設定します。

//.... 
manager.PasswordHasher = new CustomPasswordHasher(); 
//.... 

さて、私は古いハッシュ(SHA1)を削除したいです新しいハッシュを保存してください。私はそれを行うことができますか?

ありがとうございます!

答えて

3

ユーザーがログインしようとするまで、これを行うことはできません。あなたはSHA1ハッシュしか持っていません。 SHA1から他のハッシュアルゴリズムに変換することはできません。

しかし、ユーザーがログインすると、パスワードがメモリに保存され、新しいハッシュが生成されます。ここにいくつかの疑似コード:

public void Login(String username, String password) 
{ 
    if(DoesOldHashMatch(username, password)){ 
     var newHash = NewHasher.GetPasswordHash(password); 
     UpdateUserPasswordHash(username, newHash); 
     SetLoginCookie(username); 
     return; 
    } 
    if(NewHashMatch(username, password)) 
    { 
     SetLoginCookie(username); 
    } 
} 
+1

ありがとうございます!あなたは私が問題を解決するのを手伝った! –

関連する問題