什么是哈希加盐法?


废话少说:对于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学习哈希加盐法的更多相关文章

  1. 使用哈希加盐法来为密码加密(补充JAVA的实现)

    使用哈希加盐法来为密码加密 转自:http://www.cnblogs.com/jfzhu/p/4023439.html 转载请注明出处   (一)为什么要用哈希函数来加密密码 如果你需要保存密码(比 ...

  2. 从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构

    Microsoft.AspNet.Identity简介 Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的mem ...

  3. Asp.net Identity 系列之 怎样修改Microsoft.AspNet.Identity.EntityFramework.IdentityUser 的 Id 字段的数据类型

    这篇博客我们来学习如何将AspNetUsers 表的Id 字段 的类型由nvarchar(128) 改为Int 并且子增长 1.为什么要修改 如果你运行过 Asp.net mvc 示例项目,你好会发现 ...

  4. Microsoft.AspNet.Identity 自定义使用现有的表—登录实现

    Microsoft.AspNet.Identity是微软新引入的一种membership框架,也是微软Owin标准的一个实现.Microsoft.AspNet.Identity.EntityFrame ...

  5. Microsoft.AspNet.Identity.EntityFramework/IdentityDbContext.cs

    using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; ...

  6. Microsoft.AspNet.Identity 的简单使用

    要完成一个简单的注册,登陆,至少需要实现Identity中的3个接口 IUser IUserStore<TUser> : IDisposable where TUser : IUser I ...

  7. MVC5中 在更新 Microsoft.Aspnet.Identity 后编译器错误

    环境:vs2013预览版chs,我试着创建vb.net web应用,从对话框中选择MVC和WebAPI.编译ok了.通过NuGet管理器更新了Microsoft.Aspnet.Identity.Cor ...

  8. Microsoft.AspNet.Identity 自定义使用现有的表—登录实现,aspnet.identity

    Microsoft.AspNet.Identity是微软新引入的一种membership框架,也是微软Owin标准的一个实现.Microsoft.AspNet.Identity.EntityFrame ...

  9. Microsoft.AspNet.Identity: UserID用整型数据表示, 而不是GUID

    第一篇:  这个好像不太好 http://stackoverflow.com/questions/19553424/how-to-change-type-of-id-in-microsoft-aspn ...

随机推荐

  1. wemall doraemon中Android app商城系统向指定URL发送GET方法的请求代码

    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...

  2. sonarqube代码检测

    1.安装java环境 略 2.下载sonarqube包 sonarqube与sonar-runner的下载地址:http://www.sonarqube.org/downloads/ 将下载好的软件包 ...

  3. JavaWeb之Filter过滤器

    原本计划这一篇来总结JSP,由于JSP的内容比较多,又想着晚上跑跑步减减肥,所以今天先介绍Filter以及它的使用举例,这样的话还有些时间可以锻炼锻炼.言归正传,过滤器从字面理解她的话有拦网.过滤的功 ...

  4. 老司机实战Windows Server Docker:1 初体验之各种填坑

    前言 Windows Server 2016正式版发布已经有近半年时间了,除了看到携程的同学分享了一些Windows Server Docker的实践经验,网上比较深入的资料,不管是中文或英文的,都还 ...

  5. Omi v1.0.2发布 - 正式支持传递javascript表达式

    原文地址:https://github.com/AlloyTeam/omi/ 写在前面 Omi框架可以通过在组件上声明 data-* 把属性传递给子节点. Omi从设计之初,就是往标准的DOM标签的标 ...

  6. iOS开发之数据存储之SQLite3(包括FMDB)

    1.概述 SQLite3是一款开源的嵌入式关系型数据库,可移植性好.易使用.内存开销小. SQLite3是无类型的,意味着你可以保存任何类型的数据到任意表的任意字段中.比如下列的创表语句是合法的: c ...

  7. Python 一些有趣的技巧哦!

    #Python 技巧命令 python 如一股清流,可以说屌到飞起,下面咱就来看看一些屌的东西 ### python2 最简单的web服务 ` python -m SimpleHTTPServer 8 ...

  8. 谈谈在DevOps实践中,感觉最重要的这三个技术……

    从国内众多DevOps实践中,我们能看到下面三个技术尤其重要和火热: 容器:容器从根本上解决了软件对环境的依懒性,解决了各个环境之间的差异问题:它可以加速部署的速度,提高部署的效率:降低部署的成本.容 ...

  9. Tcl与Design Compiler (十二)——综合后处理

    本文如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/  ,作者:IC_learner 概述 前面也讲了一些综合后的需要进行的一些工作,这 ...

  10. Ubuntu14.04配置Apache支持多个站点

    怎样在一个Ubuntu的机器上(虚拟机)配置Apache支持多个网站呢? 比如你有一台独立的Ubuntu虚拟机,配有一个外网的IP(45.46.47.48),并且注册了两个域名AAA.com和BBB. ...