재우니의 블로그

 

ASP.NET IDENTITY 에서 패스워드를 암호화 문자열을 가져오는 방법은 아래와 같다.

 

Microsoft.AspNet.Identity.PasswordHasher pwdHasher = new Microsoft.AspNet.Identity.PasswordHasher();

string encpwd = pwdHasher.HashPassword("shimjaewoon")


 

asp.net identity 의 패스워드는 hash 형태로 저장이 된다.  그리고 hash 값은 랜덤하게 나온다. 따라서 패스워드 입력값과 동일한지 확인하기 위해서는 비교 하는 것 말곤 복고화 하는 방법은 없다. 따라서 아래의 함수에 따라 비교하는 구문을 구성해 봤다.

해당 자료는 아래 사이트에서 쉽게 찾아볼 수 있다.


https://github.com/aspnet/Identity/blob/dev/src/Microsoft.AspNet.Identity/PasswordHasher.cs


ViewBag.Pwd = HashPassword("shimjaewoon!"); bool response = VerifyHashedPassword(ViewBag.Pwd, "shimjaewoon"); ViewBag.YesNo = (response) ? "예" : "아니오";

실행해 보면,,

AKMJ6xfLbvHp6p7nYFRU3EHXlYXJJUzhh4HI+/akm/Ev7v8v90U11doTtyXogXddGg==

public string HashPassword(string password)
{
    byte[] salt;
    byte[] buffer2;
    if (password == null)
    {
    throw new ArgumentNullException("password");
    }
    using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(password, 0x10, 0x3e8))
    {
    salt = bytes.Salt;
    buffer2 = bytes.GetBytes(0x20);
    }
    byte[] dst = new byte[0x31];
    Buffer.BlockCopy(salt, 0, dst, 1, 0x10);
    Buffer.BlockCopy(buffer2, 0, dst, 0x11, 0x20);
    return Convert.ToBase64String(dst);
}

public bool VerifyHashedPassword(string hashedPassword, string password)
{
    byte[] buffer4;
    if (hashedPassword == null)
    {
    return false;
    }
    if (password == null)
    {
    throw new ArgumentNullException("password");
    }
    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);
}

private bool ByteArraysEqual(byte[] a, byte[] b)
{
    if (a == null && b == null)
    {
    return true;
    }
    if (a == null || b == null || a.Length != b.Length)
    {
    return false;
    }
    var areSame = true;
    for (var i = 0; i < a.Length; i++)
    {
    areSame &= (a[i] == b[i]);
    }
    return areSame;
}