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;
}