namespace Microsoft.AspNet.Identity
{
public class PasswordHasher : IPasswordHasher
{
public virtual string HashPassword(string password)
{
return Crypto.HashPassword(password);
} public virtual PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword)
{
if (Crypto.VerifyHashedPassword(hashedPassword, providedPassword))
{
return PasswordVerificationResult.Success;
}
return PasswordVerificationResult.Failed;
}
}
}
using System;
using System.Runtime.CompilerServices;
using System.Security.Cryptography; namespace Microsoft.AspNet.Identity
{
internal static class Crypto
{
private const int PBKDF2IterCount = 1000; private const int PBKDF2SubkeyLength = 32; private const int SaltSize = 16; public static string HashPassword(string password)
{
if (password == null)
{
throw new ArgumentNullException("password");
}
byte[] salt;
byte[] bytes;
using (Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, 16, 1000))
{
salt = rfc2898DeriveBytes.Salt;
bytes = rfc2898DeriveBytes.GetBytes(32);
}
byte[] array = new byte[49];
Buffer.BlockCopy(salt, 0, array, 1, 16);
Buffer.BlockCopy(bytes, 0, array, 17, 32);
return Convert.ToBase64String(array);
} public static bool VerifyHashedPassword(string hashedPassword, string password)
{
if (hashedPassword == null)
{
return false;
}
if (password == null)
{
throw new ArgumentNullException("password");
}
byte[] array = Convert.FromBase64String(hashedPassword);
if (array.Length != 49 || array[0] != 0)
{
return false;
}
byte[] array2 = new byte[16];
Buffer.BlockCopy(array, 1, array2, 0, 16);
byte[] array3 = new byte[32];
Buffer.BlockCopy(array, 17, array3, 0, 32);
byte[] bytes;
using (Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, array2, 1000))
{
bytes = rfc2898DeriveBytes.GetBytes(32);
}
return Crypto.ByteArraysEqual(array3, bytes);
} [MethodImpl(MethodImplOptions.NoOptimization)]
private static bool ByteArraysEqual(byte[] a, byte[] b)
{
if (object.ReferenceEquals(a, b))
{
return true;
}
if (a == null || b == null || a.Length != b.Length)
{
return false;
}
bool flag = true;
for (int i = 0; i < a.Length; i++)
{
flag &= (a[i] == b[i]);
}
return flag;
}
}
}

最新文章

  1. dreamweaver cs6 mac破解版
  2. 数据库和3G的结合使用
  3. Anaroid WebView 的属性汇总
  4. 浅谈C# 匿名变量
  5. JS多种方法实现随机颜色;
  6. France &#39;98
  7. kvstore之memcached为存储介质
  8. leetcode — symmetric-tree
  9. pandas的简单使用
  10. OpenCV图像分割1
  11. Java学习笔记51(综合项目:家庭记账系统)
  12. Lamda 表达式里的Join和GroupJoin的区别, 如何实现SQL的Left Join效果
  13. hdu6365 2018 Multi-University Training Contest 6 1004 Shoot Game
  14. 微信小程序中跳转另一个小程序
  15. Gym - 101522H Hit!
  16. django自带的登录验证功能
  17. c++11 智能指针 unique_ptr、shared_ptr与weak_ptr
  18. 配置Java的jdk环境变量
  19. js实现table合并相同列单元格
  20. 手机游戏运营主要的指标是什么? 7天活跃, 14天活跃 ARPU ?如何提升游戏 app 的虚拟道具的收入?

热门文章

  1. 网络流 HDU 3605
  2. Havel-Hakimi定理
  3. java类生命周期详细解析
  4. WebApi支持命名空间重名问题
  5. (转) Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么?
  6. 【BZOJ-1717】Milk Patterns产奶的模式 后缀数组
  7. BZOJ 1088 扫雷Mine
  8. Windows Server 2012及以上安装IIS的步骤
  9. Diccuz!NT的dll版本号控制技巧
  10. hdu5175 gcd 求约数