如题,MD5被解密后,网站大家现在都用什么方法做加密呢?
做了个购物的网站,快要上线了,原来用户登录用的是MD5,现在不知道该咋改,来听听大家的做法,学习一下,谢谢大家啦!
------解决思路----------------------
用MD5加密后对字符串进行截取(取前四位后四位)加上用户特有的东西,这个具体看你,弱弱的问一句MD5何时被破解的!
------解决思路----------------------
听风是风啊。。。。。
MD5之前对字符串做一些特殊处理(你可以理解为MD5之前进行一次加密),你看那些所谓的破解还对不对
------解决思路----------------------
你加上一些比较特殊的字符你看他破不破解的出来!之后会提示你要收费
------解决思路----------------------
多次MD5加密
------解决思路----------------------
网上md5的破解主要都是采用暴力生成各种字符串组合然后进行hash,很多用户的密码都不够复杂,所以很容易被这种方式生成出来。防范这种方式的办法一个是随机salt,只要salt够随机也够长,就会带来巨大的状态空间,极大降低被暴力生成到的可能。另一个办法是生成hash的速度够慢,比如迭代1000次,这样就大大降低了暴力运算的速度。
给你个例子:使用 hmacsha256 方式,使用随机salt做hmac的key,salt长度不应低于16字节,数据库保存hash的结果和salt,这也是asp.net自带membership provider的做法。
/// <summary>
/// 生成指定字节的随机salt,返回base64形式
/// </summary>
public static string GenerateSalt(int length)
{
var saltBytes = new byte[length];
using(var rnd = new RNGCryptoServiceProvider())
{
rnd.GetBytes(saltBytes);
}
return Convert.ToBase64String(saltBytes);
}
/// <summary>
/// 使用HMACSHA256处理密码,返回base64形式
/// </summary>
public static string EncodePassword(string pass, string salt)
{
var passBytes = Encoding.UTF8.GetBytes(pass);
var saltBytes = Convert.FromBase64String(salt);
byte[] outBytes;
using (var hash = new HMACSHA256(saltBytes))
{
outBytes = hash.ComputeHash(passBytes);
}
return Convert.ToBase64String(outBytes);
}
/// <summary>
/// 检查密码是否正确
/// </summary>
public static bool CheckPassword(string pass, string hash, string salt)
{
return string.Equals(hash, EncodePassword(pass, salt), StringComparison.Ordinal);
}
// 使用方法
var pass = "passowrd"; // 用户密码
var salt = GenerateSalt(16); // 16字节salt的base64形式,保存数据库
var hash = EncodePassword(pass, salt); // 用户密码hash的base64形式,保存数据库
Console.WriteLine(hash);
Console.WriteLine(salt);
// 将用户密码,和数据库里取出的hash和salt来验证
var isValid = CheckPassword(pass, hash, salt);
Console.WriteLine(isValid);
------解决思路----------------------
其实如果你知道破解原理,就可以很轻松的应对了
所谓破解,不过是将很多简单密码生成MD5然后一组一组的存进数据库里,你输入了MD5,就响应的查询出明文来
但是这样只能有限的匹配,不可能罗列出所有的组合
尤其是带特殊符号的组合
最多就是把简单字母+数字组合罗列一部分已经很了不起了,而且位数也一定有限制
你可以按网上的办法,加"盐",比如固定加上ABCDEF*&^%$#这种东西,哪怕用户仅仅输入了一个1,你也用代码给它补齐32位,然后再做MD5,我不信哪个网站的数据库能把这东西也都存进去
当然要验证登陆之前,你也要按同样的规则把用户输入的内容加上相同的"盐"然后再比较
------解决思路----------------------
用MD5加密后对字符串进行截取(取前四位后四位)加上用户特有的东西,这个具体看你,弱弱的问一句MD5何时被破解的!
------解决思路----------------------
或者你不要用纯MD5
生成MD5(32位16进制数)后,后面追加个固定的1234,或者随机数什么的,或者加在中间,让人找不到规律就行
这东西拿到网上必然是破解不出来了
你验证之前,自己知道哪几个字符是后加进去的,去掉之后再验证
------解决思路----------------------
MD5没被破解吧,最多也就是把一些简单的密码生成MD5字串,然后循环暴力破解
------解决思路----------------------
破解MD5???
撸主相信那些破解网站??
11楼大神已经解释了,如果你非要设个密码是admin,大家都知道admin的MD5是啥了,那你怎么加密也没用,也会有可能被暴力字典破解的.
给撸主一个思路,每个用户注册时,给该用户一个guid,然后把这个guid根据自己的算法做些操作,如取其中几位,或把guid做md5,sha之类加密后,再取出6位,把这6位做为密钥,把用户的密码做des加密.
也可以把guid加密后的某些位置的字符拿出来当盐,加到用户密码中,再做md5,sha之类的加密.
------解决思路----------------------
一.关于MD5被"破解"
1.MD5是不可逆的,所以,MD5是不可能被破解的.
2.所谓破解,只是MD5碰撞.
3.可以适当处理,MD5的安全是不可破的.
二.如何防碰撞.
MD5碰撞是有几个特点:
1.多数情况下,会产生不可视字符,而密码不可能存在不可视字符的.
2.生成"碰撞"的字符,能和你密码本身长度相等的.基本不可能.
基于上面两点.只要稍作点文章.就可以防止MD5碰撞了.
1.密码过滤不过视字符.
2.密码是定长的.例如:32个字符.用户不够的字符,用一固定字符如:空格补充.超长的.一律非法.
------解决思路----------------------
10楼的方法不错,就是给MD5数据加盐。
------解决思路----------------------
md5没有被破解,那些网站只是按照一些人提供的数据推测出明文,但是成功率也是很低的。
你可以自己写加密算法,或者在MD5加密后,自己再二次处理,这个处理方法就要你自己来定了。
------解决思路----------------------
admin、1、123、abc之类的MD5密文天下皆知
但你说S6iYr5*oE2的密文是啥
------解决思路----------------------
md5的主要问题就是容易进行碰撞攻击,而且这方面现在中国的密码学团队处于领先地位,2013年已经把碰撞攻击的时间降低到了1秒之内。关于md5的弱点,维基百科很详细了,百度百科都有写。md5早就不建议在安全相关的场景使用,别说md5了,连sha-1都不建议用。现在安全方面都应该使用sha-2家族算法,也就是sha224/256/384/512这些。
当然在普通网站hash用户密码的场景,碰撞倒是其次,最主要的还是salt,不加salt那用任何强度的hash也没用。salt不能用固定值,尤其不能用常规字符,面对暴力破解那和没加一样,一定是够长的密码学随机数。现在使用GPU进行hash运算的速度非常非常非常快,字典文件也做的非常非常非常好,我们自己当然懂得密码安全,但是不能指望用户的安全意识有多好。而且作为网站作者,也不能把密码安全的责任推给用户,绝大多数用户不可能知道网站存储密码背后的原理,如果密码限制过强,用户容易忘记自己的密码,他会抱怨网站而不是自己。
关于随机数,安全场景下必须使用密码学强度的随机数,也就是要足够随机,不能有轻易被识别的规律。不能用普通的Random,也不能用Guid,更不能自己乱写。普通的Random是简单的数列,Guid的目的是唯一,不是随机,它大部分是时间相关的,自己乱写估计还不如Random,这些都有规律。只要有足够的利益驱动,就会有人去找规律来预测下一次的随机数。比如一些可以有实际收益的在线扑克/麻将之类的地方,如果使用的随机强度不够,就可以被推测出别人的或者之后要发的牌。
更不用说安全证书的场景了,微软原来有使用md5进行签名hash的证书就被病毒伪造过。
总结下,md5目前的状态已经不应被认为是密码学级别的hash了,只应被当作类似crc的checksum级别。能不用就不要再用,使用sha256或sha512。.net上salt使用RNGCryptoServiceProvider生成,虽然这也不是真随机,不过一般够用,长度不要低于16字节,也就是128位。
------解决思路----------------------
放心吧,我之前也有你一样的担心,经过实验,纯数字基本能破解,纯数字加字母以上的基本无解,两种以上组合基本无解,不过只是基本,要相信一句话:这个世界上没有什么密码是不能破解的,只是要的时间长短,破解的成本超出收获的利益,没人愿意做
,个人认为一般的软件开发人员,不必要把主要精力放在软件安全这块上
------解决思路----------------------
除了一个加密安全问题,也得考虑性能问题
你一层md5容易被破解
你多来几次md5被破解的概率就比较低了
目前他们破解md5不都是 用的字库方式么
你多md5几次 被破解的记录就大大降低了
------解决思路----------------------
用户密码+2k固定图片文件做MD5,你去破把,看看能登录不。
------解决思路----------------------
破解?我同意楼上大多数人的想法:所谓的破解都是暴力破解。
安全是没有绝对的,个人认为只是相对的
下面的加密方式,相对而言,足够安全了:
md5(md5(明文)+盐)
------解决思路----------------------
很多破解好像不是存破解,都是有密码库
一堆免费网站、免费空间、免费信箱,不是佛心的我怀疑它们都会转卖你的帐号密码
很多人帐号同一套密码 BJ4......
一些所谓的破解都是有密码库转成加密过的暗码
EX: 密码 1234→经过MD5加密→ AH%$^rh( 只要你用MD5加密的123永远都会是AH%$^rh )
没有真正的破解,只有暴力破解
建议密码可以用歌词记忆法 (你平常用键盘打歌词的位置,切成英文键盘打成的密码,英文数字符号都有,好记、复杂度超高)
------解决思路----------------------
最简单的方法就是多次加密。
------解决思路----------------------
其实最简单的方法 就是 先把密码MD5 然后再次MD5 就算解一次 也不是原密码 同样 你也可以 N次加密。
------解决思路----------------------
或者组合加密。 比如密码 是password 那就md5(sha1(password)+md5(password))
只要你加密好 就行了。 组合策略选一个就行
------解决思路----------------------
所谓"加盐"是不能防碰撞的.加盐或两次MD5是为了防字典破解.
随意举个例.
如你的密码是: 123456 , MD5是:9876535464
碰撞就是产生一个和你密码MD5值一样的字符串.如:ABCDEFGH.
用户在前台输入 ABCDEFGH 和你输入 123456 是一样的,因为两者的MD5值一样.
加盐能防止界面的输入,但防不了中间人.
------解决思路----------------------
解决办法就是不要纯MD5
不管MD5重复多少次,最终还是MD5,还是无法防碰撞
但是MD5是固定位数的,32位16进制数
假如你按如下的规则生成密文:
MD5(密码+盐)+MD5(盐)
或者再将上面的64位16进制数打乱一下次序,我不信谁还能碰撞出来
------解决思路----------------------
或者如果你是个网站,根本就可以采用17楼的办法,再验证一下明文长度和格式,就完全可以防止碰撞
除非破解你密码的人根本不去研究MD5,而是破解了你的客户端软件,然后直接用你数据库里的密文去登陆服务端
而如果你是单机版,根本连服务端都没有,那破解了软件之后,根本也不需要什么用户名密码就能使用全部的功能了
而网站是发布在服务器IIS上的,基本没什么可能修改你的源码
而有能力黑进服务器修改源码的人,也完全没必要那么做,人家直接就去修改数据库,直接操作文件了,根本不需要破解密码
------解决思路----------------------
/// <summary>
/// 加密解密钥匙
/// </summary>
private static string Key = "1b3@..&A";
/// <summary>
/// 加密函数
/// </summary>
/// <param name="data">加密数据</param>
/// <returns>返回加密后数据</returns>
public static string DesEncrypt(string data)
{
string result = string.Empty;
try
{
if (string.IsNullOrEmpty(data) == false)
{
//访问数据加密标准(DES)算法的加密服务提供程序 (CSP) 版本的包装对象
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Key = System.Text.ASCIIEncoding.ASCII.GetBytes(Key);//建立加密对象的密钥和偏移量
des.IV = ASCIIEncoding.ASCII.GetBytes(Key); //原文使用ASCIIEncoding.ASCII方法的GetBytes方法
byte[] inputbyteArray = Encoding.Default.GetBytes(data);//把字符串放到byte数组中
MemoryStream ms = new MemoryStream();//创建其支持存储区为内存的流
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputbyteArray, 0, inputbyteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
result = ret.ToString();
}
}
catch (Exception)
{
result = "";
}
return result;
}
/// <summary>
/// 解密E函数
/// </summary>
/// <param name="data">被解密的字符串</param>
/// <returns>返回被解密的字符串</returns>
public static string DesDecrypt(string data)
{
string result = string.Empty;
try
{
if (string.IsNullOrEmpty(data) == false)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputbyteArray = new byte[data.Length / 2];
for (int i = 0; i < data.Length / 2; i++)
{
int x = Convert.ToInt32(data.Substring(i * 2, 2), 16);
inputbyteArray[i] = (byte)x;
}
des.Key = ASCIIEncoding.ASCII.GetBytes(Key);
des.IV = ASCIIEncoding.ASCII.GetBytes(Key);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputbyteArray, 0, inputbyteArray.Length);
cs.FlushFinalBlock();
result = System.Text.Encoding.Default.GetString(ms.ToArray());
}
}
catch (Exception e)
{
result = "";
}
return result;
}
来,使用这个
------解决思路----------------------
碰撞与MD5原密码长度无关.因为MD5 是一个一对多的关系.
A字符生成DM5值是:456C2A8C-6408-4624-B2D5-93983CF1E671 .
碰撞就是找出另一个字符B.它生成的MD5值也是:456C2A8C-6408-4624-B2D5-93983CF1E671 .
在输入密框部分,如果不加干扰.那么,对密码验证来说:输入A和输入B是一样的.因为它两生成的MD5值是一样.
但碰撞有个特点.就是:1.长度和A刚刚好的可能性基本为0. 2.碰撞往往会产生非键盘字符.
所以,要过滤,并加干扰.
------解决思路----------------------
加盐或加干扰的目的是防字典破解. 但防不了中间人攻击. 其实,防止的办法有很多.最简单的,就是加RSA包装一次.这样可以一定程度上防中间人.