PasswordHasher
2016-08-05 16:21
405 查看
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; } } }
相关文章推荐
- centos6.5-64bit安装htop
- Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】
- hdu 2647 Reward(拓扑排序)
- 分类算法—决策树
- H5学习之22 CSS-导航栏的创建
- java 线程同步
- FFmpeg移植Android编译生成多库
- WebUploader文件图片上传插件的使用
- Intellij IDEA快捷键
- Android 通过Java代码生成创建界面。动态生成View,动态设置View属性。addRules详解
- gcc编译错误表
- UVALive 7267 Mysterious Antiques in Sackler Museum (判断长方形)
- oracle11g安装地址链接
- Android UI之半圆式卫星菜单(无动画)
- Button按钮实现按下不同状态切换功能
- HDU Problem 2647 Reward【拓扑排序】
- 动态规划动态转移方程总结
- SQL学习笔记
- 自己动手写一个轻量级的Android网络请求框架
- textView的学习使用