跟Microsoft.AspNet.Identity学习哈希加盐法
什么是哈希加盐法?
废话少说:对于MD5这种加密算法,同样的密码每次加密后得到的密文是一样的,所以黑客可以利用已知的密码库(彩虹库)对目标数据库密文进行对比进行攻击。
怎样解决:哈希加盐法,以下是网上给出的方案。http://blog.csdn.net/cryeyes/article/details/5375810
方案一:将用户密码与固定salt字串进行拼接,再进行Hash计算得到密文。
此方案的缺点很明显,通过密码库进行对比,直接可获得很多[用户密码 + salt]的字串,即可推断出salt字串,改进算法,获得用户密码。
方案二:先为用户生成随机salt字串,进行方案一的计算,然后将随机salt字串,作为一列存储在用户表中进行登录验证。
此方案可以明显改进方案一,因为salt不重复,所以加大破解难度。
AspNet.Identity 是怎么做的?
上反编译神器,反编译Dll --> Microsoft.AspNet.Identity.Core.dll,先定位到创建用户方法CreateAsync(TUser user, string password)
再往下看,已经找到加密方法了,GOGOGO。
最后会到这里,核心加密的地方了,如图:
这里Rfc2898DeriveBytes的构造方法的第二个参数的意义是随机生成16位的Salt,第一个参数构造为一个hmacsha1,为后面的hash做基础数据。
第三个参数是什么意思呢?在后面的方法得到验证是将密码进行多少次hash,1000次……
具体算法太复杂,伤不起,也没必要看了,关键是了解方法,总结一下流程:
1.随机生成一个16位的salt字节数组。
2.通过计算密码与salt得到32位密文。
3.组建一个49位字节数组,第一位固定为0x00,2 - 17位为salt,18 - 49位为密文。
4.对字节数组进行Base64加密得到最终密文。
现在是不是你也可以使用哈希加盐法设计一个自己的用户密码加密算法了呢?
如何在自己代码中使用?
方案一:
这是在asp.net mvc中的实现,如果在低版本或客户端,如何实现类似的功能呢,通过gg得知,原来Rfc2898DeriveBytes已经是NF中的一个加密工具类,那么自己实现就很简单了,就是抄反编译出的代码嘛。http://msdn.microsoft.com/zh-cn/library/system.security.cryptography.rfc2898derivebytes(v=vs.110).aspx
internal static class Crypto { ; ; ; private static bool ByteArraysEqual(byte[] a, byte[] b) { if (object.ReferenceEquals(a, b)) { return true; } if (a == null || b == null || (int)a.Length != (int)b.Length) { return false; } bool flag = true; ; i < (int)a.Length; i++) { flag = flag & a[i] == b[i]; } return flag; } public static string HashPassword(string password) { byte[] salt; byte[] bytes; if (password == null) { throw new ArgumentNullException("password"); } , )) { salt = rfc2898DeriveByte.Salt; bytes = rfc2898DeriveByte.GetBytes(); } ]; Buffer.BlockCopy(salt, , numArray, , ); Buffer.BlockCopy(bytes, , numArray, , ); return Convert.ToBase64String(numArray); } public static bool VerifyHashedPassword(string hashedPassword, string password) { byte[] bytes; if (hashedPassword == null) { return false; } if (password == null) { throw new ArgumentNullException("password"); } byte[] numArray = Convert.FromBase64String(hashedPassword); || numArray[] != ) { return false; } ]; Buffer.BlockCopy(numArray, , numArray1, , ); ]; Buffer.BlockCopy(numArray, , numArray2, , ); )) { bytes = rfc2898DeriveByte.GetBytes(); } return Crypto.ByteArraysEqual(numArray2, bytes); } }
方案二:
更懒一点你就直接使用Microsoft.AspNet.Identity.Core中的PasswordHasher工具类吧。
跟Microsoft.AspNet.Identity学习哈希加盐法的更多相关文章
- 使用哈希加盐法来为密码加密(补充JAVA的实现)
使用哈希加盐法来为密码加密 转自:http://www.cnblogs.com/jfzhu/p/4023439.html 转载请注明出处 (一)为什么要用哈希函数来加密密码 如果你需要保存密码(比 ...
- 从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构
Microsoft.AspNet.Identity简介 Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的mem ...
- Asp.net Identity 系列之 怎样修改Microsoft.AspNet.Identity.EntityFramework.IdentityUser 的 Id 字段的数据类型
这篇博客我们来学习如何将AspNetUsers 表的Id 字段 的类型由nvarchar(128) 改为Int 并且子增长 1.为什么要修改 如果你运行过 Asp.net mvc 示例项目,你好会发现 ...
- Microsoft.AspNet.Identity 自定义使用现有的表—登录实现
Microsoft.AspNet.Identity是微软新引入的一种membership框架,也是微软Owin标准的一个实现.Microsoft.AspNet.Identity.EntityFrame ...
- Microsoft.AspNet.Identity.EntityFramework/IdentityDbContext.cs
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; ...
- Microsoft.AspNet.Identity 的简单使用
要完成一个简单的注册,登陆,至少需要实现Identity中的3个接口 IUser IUserStore<TUser> : IDisposable where TUser : IUser I ...
- MVC5中 在更新 Microsoft.Aspnet.Identity 后编译器错误
环境:vs2013预览版chs,我试着创建vb.net web应用,从对话框中选择MVC和WebAPI.编译ok了.通过NuGet管理器更新了Microsoft.Aspnet.Identity.Cor ...
- Microsoft.AspNet.Identity 自定义使用现有的表—登录实现,aspnet.identity
Microsoft.AspNet.Identity是微软新引入的一种membership框架,也是微软Owin标准的一个实现.Microsoft.AspNet.Identity.EntityFrame ...
- Microsoft.AspNet.Identity: UserID用整型数据表示, 而不是GUID
第一篇: 这个好像不太好 http://stackoverflow.com/questions/19553424/how-to-change-type-of-id-in-microsoft-aspn ...
随机推荐
- 【iOS】7.4 定位服务->2.1.1 定位 - 官方框架CoreLocation: 请求用户授权
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 修改Delphi 10.1.2 edit控件在android的复制、剪切和粘贴样式
Delphi 10.1.2 edit控件在android默认的复制.剪切和粘贴样式太丑,经悟能-DelphiTeacher的提示,用最简单的代码修改后稍有改观. 默认的样式: 修改后的样式: 修改FM ...
- [笔记]LibSVM源码剖析(java版)
之前学习了SVM的原理(见http://www.cnblogs.com/bentuwuying/p/6444249.html),以及SMO算法的理论基础(见http://www.cnblogs.com ...
- [C++]现行的试卷封面并获取学生题目得分信息以及学号信息的原型系统
大二的时候写的一个CV小玩意,最终决定还是把它放出来,也许会帮助到很多人,代码写的很丑,大家多多包涵.附加实验报告主要部分. 课题背景及意义: 本项目主要目标是设计一套能自动分析我校现行的试卷封面并获 ...
- TimeUnit枚举类
TimeUnit是 java.util.concurrent 中的一个枚举类.一般让线程进行睡眠时使用: TimeUnit.MILLISECONDS.sleep(100); 比如上面一行代码表示让当 ...
- JavaEE开发基于Eclipse的环境搭建以及Maven Web App的创建
本篇博客就完整的来聊一下如何在Eclipse中创建的Maven Project.本篇博客是JavaEE开发的开篇,也是基础.本篇博客的内容干货还是比较多的,而且比较实用,并且都是采用目前最新版本的工具 ...
- (11)连个工具类之间的比较4.Collections与Arrays
集合框架中的工具类:特点:该工具类中的方法都是静态的. Collections:常见方法: 1, 对list进行二分查找: 前提该集合一定要有序. int binarySearch(list,key) ...
- java 反射与常用用法
java通常是先有类再有对象,有对象我就可以调用方法或者属性. 反射其实是通过Class对象来调用类里面的方法.通过反射可以调用私有方法和私有属性.大部分框架都是运用反射原理. 如何获得Class对象 ...
- javaWEB与JSP指令
JSP三大指令 一个jsp页面中,可以有0~N个指令的定义!1. page --> 最复杂:<%@page language="java" info="xx ...
- Vue.use自定义自己的全局组件
通常我们在vue里面使用别人开发的组件,第一步就是install,第二步在main.js里面引入,第三步Vue.use这个组件.今天我简单的也来use一个自己的组件. 这里我用的webpack-sim ...