기본 구현 ( ASP.NET Framework 또는 ASP.NET Core ) 작동 방식은 다음과 같습니다 . 그것은 사용 키 유도 기능을 해시를 생성하는 임의의 소금. 소금은 KDF 출력의 일부로 포함됩니다. 따라서 동일한 비밀번호를 "해시"할 때마다 다른 해시를 얻게됩니다. 해시를 확인하기 위해 출력이 솔트와 나머지로 다시 분할되고 KDF는 지정된 솔트를 사용하여 비밀번호에서 다시 실행됩니다. 결과가 나머지 초기 출력과 일치하면 해시가 확인됩니다.
해싱 :
public static 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 static 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);
}