一种简单的md5加盐加密的方法(防止彩虹表撞库)
md5加密(或者说摘要算法)大家都很熟悉了 就不解释了
现在很多数据库设计都喜欢用单向加密的方式保存密码,验证时对提交的密码再次加密之后做密文对比
/// <summary> 使用MD5加密
/// </summary>
/// <param name="input">加密字符串</param>
/// <remarks>2015.08.26</remarks>
public static Guid ToMD5(string input)
{
using (var md5Provider = new MD5CryptoServiceProvider())
{
var bytes = Encoding.UTF8.GetBytes(input);
var hash = md5Provider.ComputeHash(bytes);
var count = hash.Length;
hash[0] = (byte)(hash[3] + (hash[3] = hash[0]) * 0); //交换0,3的值
hash[1] = (byte)(hash[2] + (hash[2] = hash[1]) * 0); //交换1,2的值
hash[5] = (byte)(hash[4] + (hash[4] = hash[5]) * 0); //交换4,5的值
hash[7] = (byte)(hash[6] + (hash[6] = hash[7]) * 0); //交换6,7的值
return new Guid(hash);
}
}
这种设计最初是防止被暴库之后 黑客可以直接得到用户的密码而设计的,因为是单向加密,所以即便知道加密算法也无法得到用户的实际密码
但是所谓道高一尺魔高一丈, 在彩虹表出现之后, 单纯的md5也不安全了
以下摘自百度百科:
彩虹表是一个用于加密散列函数逆运算的预先计算好的表, 常用于破解加密过的密码散列。一般主流的彩虹表都在100G以上。 查找表常常用于包含有限字符固定长度纯文本密码的加密。这是以空间换时间的典型实践, 在每一次尝试都计算的暴力破解中使用更少的计算能力和更多的储存空间,但却比简单的每个输入一条散列的翻查表使用更少的储存空间和更多的计算性能。使用加盐的KDF函数可以使这种攻击难以实现。
简单的来说就是 攻击者 将简单的密码(123456,111111,888888等)密码事先进行md5加密,得到密文(如123456->e10adc3949ba59abbe56e057f20f883e),然后使用这张表的数据去对比被暴的数据库的密文
这样单纯的md5,很容易就被拿下了
所以后来出现了 2次md5...N次md5, 当然这种也是然并卵......
所以后来出现了加盐加密,
简单来说:比如登录名是blqw ,密码123456 ,则数据库的密文是 md5(123456+blqw),这样可以保证,即使用户的密码是一样的,但密文却不同,这样彩虹表就歇菜了
加盐的方式有很多,一种是 md5(密码+登录名) ,这种方式大部分情况下是可以的
但是登录名修改后,密文也要修改,但是这时候你已经不知道密码的原文是什么了....(虽然一般的登录名是不能修改的,但是产品汪的想法谁知道呢.....)
或者也有人选择多建一个字段用于存放混淆码, 但是依然很麻烦
好了,说了这么多 下面就说说今天的主题,一种比较简单的加盐的方式
public static Guid ToRandomMD5(string input)
{
using (var md5Provider = new MD5CryptoServiceProvider())
{
//获取一个256以内的随机数,用于充当 "盐"
var salt = (byte)Math.Abs(new object().GetHashCode() % 256);
input += salt;
var bytes = Encoding.UTF8.GetBytes(input);
var hash = md5Provider.ComputeHash(bytes);
hash[0] = salt;
return new Guid(hash);
}
} public static bool EqualsRandomMD5(string input, Guid rmd5)
{
var arr = rmd5.ToByteArray();
//将盐取出来
var salt = arr[0];
using (var md5Provider = new MD5CryptoServiceProvider())
{
input += salt;
var bytes = Encoding.UTF8.GetBytes(input);
var hash = md5Provider.ComputeHash(bytes);
for (int i = 1; i < 16; i++)
{
if (hash[i] != arr[i])
{
return false;
}
}
return true;
}
}
简单的来说就是把盐放到密文里面 md5 hash完之后得到一个16长度的byte 而byte可以保存0~255的整数 ,所以例子里面,随机的盐就是0~255的数字
然后md5(明文+盐)之后 再将盐保存到 byte[0] 的位置

这样每次hash之后 密文都是不同的 但是依然可以直接密文比较, 这里就是抛砖引玉,觉得255不够的 还可以加一位
当然也可以直接放在1~15的索引上
当然也可以把索引15的byte对15取余后得到0~14然后再放进去....
一种简单的md5加盐加密的方法(防止彩虹表撞库)的更多相关文章
- md5加密,md5加盐加密和解密
package com.java.test; import java.security.MessageDigest; import java.security.SecureRandom; import ...
- MD5 加盐加密
一.概述 MD5(Message Digest Algorithm 5),是一种散列算法,是不可逆的,即通过md5加密之后没办法得到原文,没有解密算法. 在一般的项目中都会有登录注册功能,最简单的, ...
- MD5加盐加密
package com.chauvet.utils; import java.security.NoSuchAlgorithmException; import java.util.Random; / ...
- MD5加密算法中的加盐值 ,和彩虹表攻击 防止彩虹表撞库
一.什么是彩虹表? 彩虹表(Rainbow Tables)就是一个庞大的.针对各种可能的字母组合预先计算好的哈希值的集合,不一定是针对MD5算法的,各种算法的都有,有了它可以快速的破解各类密码.越是复 ...
- Java使用MD5加盐进行加密
Java使用MD5加盐进行加密 我使用的方法是导入了md5.jar包,就不需要再自己写MD5的加密算法了,直接调用方法即可 点击下载md5包 import com.ndktools.javamd ...
- 加盐加密salt
加盐加密是一种对系统登录口令的加密方式,它实现的方式是将每一个口令同一个叫做”盐“(salt)的n位随机数相关联. 加盐加密是一种对系统登录口令的加密方式,它实现的方式是将每一个口令同一个叫做”盐“( ...
- 【koa2】用户注册、登录校验与加盐加密
加密与解密 先介绍一下关于服务端用户名跟密码的存储状态,我们知道当前端在注册一个新用户时,会在表单内填入用户名和密码,并通过post请求提交到服务器,服务器再把用户名和密码从ctx.request.b ...
- Shiro加盐加密
接本人的上篇文章<Shiro认证.角色.权限>,这篇文章我们来学习shiro的加盐加密实现 自定义Realm: package com.czhappy.realm; import org. ...
- 关于MD5+salt盐加密
MD5+salt 最近浏览浏览一些帖子时,发现曾经引以为傲的md5加密算法,虽然是无法解密的算法,但是现在可以通过FELHELP(谷歌浏览器插件)或者一些字典可以套出来,.但是当md5+salt值时, ...
随机推荐
- 拨开迷雾,找回自我:DDD 应对具体业务场景,Domain Model 到底如何设计?
写在前面 除了博文内容之外,和 netfocus 兄的讨论,也可以让你学到很多(至少我是这样),不要错过哦. 阅读目录: 迷雾森林 找回自我 开源地址 后记 毫无疑问,领域驱动设计的核心是领域模型,领 ...
- WPF 微信 MVVM
公司的同事离职了,接下来的日子可能会忙碌,能完善DEMO的时间也会少了,因此,把做的简易DEMO整体先记录一下,等后续不断的完善. 参考两位大神的日志:WEB版微信协议部分功能分析.[完全开源]微信客 ...
- Angular企业级开发(2)-搭建Angular开发环境
1.集成开发环境 个人或团队开发AngularJS项目时,有很多JavaScript编辑器可以选择.使用优秀的集成开发环境(Integrated Development Environment)能节省 ...
- maven 中snapshot版本和release版本的区别
maven中的仓库分为两种,snapshot快照仓库和release发布仓库.snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本.定义一个组件/模 ...
- 直播推流端弱网优化策略 | 直播 SDK 性能优化实践
弱网优化的场景 网络直播行业经过一年多的快速发展,衍生出了各种各样的玩法.最早的网络直播是主播坐在 PC 前,安装好专业的直播设备(如摄像头和麦克风),然后才能开始直播.后来随着手机性能的提升和直播技 ...
- 分享一个php的启动关闭脚本(原)
自己简单写的一个php服务的启动脚本和大家分享 思路(实现的原理): 1:function模块+case语句多分支判断 2:通过添加# chkconfig: 2345 43 89注释实现开机自启动(前 ...
- Linux文件查找.md
Linux 文件查找 在Linux系统的查找相关的命令: which 查看可执行文件的位置 whereis 查看文件的位置 locate 配合数据库查看文件位置 find 实际搜寻硬盘查询文件名称 w ...
- 前端如何正确选择offer,到底选哪个?
文章背景:来自于一次线上交流,当时回答感觉比较粗糙,做个阶段性的总结,也分享给其它朋友. 当时的题目是,共2个offer,如何选择: 1. 美团外卖前端 2. 京东深圳前端研发(只有通过邮件,还有收到 ...
- CYQ.Data V5 从入门到放弃ORM系列:教程 - Log、SysLogs两个日志类使用
Log 静态类介绍: Public Static (Shared) Methods GetExceptionMessage 获取异常的内部信息 WriteLogToDB Overloaded. 将日志 ...
- Nodejs之MEAN栈开发(八)---- 用户认证与会话管理详解
用户认证与会话管理基本上是每个网站必备的一个功能.在Asp.net下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...