论坛首页 Java企业应用论坛

一种简单的给MD5加盐算法

浏览 31908 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (3)
作者 正文
   发表时间:2012-10-29  
lonelybug 写道
wyuch 写道
lonelybug 写道
wyuch 写道
lonelybug 写道

第一,我开1g内存就是因为我需要防止1亿次的调用产生heap overflow,当然用加号的会先益处。
第二,看图的话你明显看出gc对于加号所做的回收工作更频繁,而且波形幅度更大(超过c cup,哈哈哈,邪恶一下),这说明每次回收所花费时间相对更多,vm锁死频率和时间都相对的大。
第三,关于你做的测试"一个比较好的测试方法时加一个JVM参数-Xmx10m,让两种方法都在10M heap里运行1亿次。我的测试结果(10万次)如下: ",这个测试命题很诡异。你测时间复杂度用100万,然后空间复杂度建议一亿,但最后你侧的是10万。我实在不知道你要测啥?最坏,最好,还是平均。

关于时间复杂度的你所谓的忽略不计。我觉得你的结论更武断一些,时间复杂度对于这个算法我们假设O(n)=cn,c是常数(16)也就是说时间复杂度函数中最高order(不好意思中文不会翻译)是n。拿我想知道你的忽略不计是说的O(0)么?


第一,永远不会溢处,1万亿次都不会。
第二,会有多大影响,用-Xmx10m就可以反映,人为地heap设得很小让gc频繁进行都只有千分之一的差距。
第三,测1万亿次都行呀,但我等不及拿结果呀,我机器跑10万次都要跑11秒,你可以自己试1亿次,两种方式差距是一样一样的。

关于时间复杂度,你的理解真是让人无语,忽略不计肯定是指两种算法之间的差距可以忽略不计。我都特意列出了执行10万次的毫秒数了,然后问“是不是可以忽略不计?”,结果你理解成了O(0)。你不能尽想着别人特傻特没常识,尽往这个方向上理解,然后自说自话吧?而且我的话没有歧义呀。

好了,我觉得我们可以不用讨论这个了,意气了哈。我自我批评一下

1、代码得更严谨,同学们的要求是很严格的,不能随便。
2、同学们提出来有问题的地方,差千分之一也是差,我应该立即改掉。
3、不能挖苦lonelybug同学,虽然他也控苦我(最多是挖苦吧,诋毁什么的大严重了)。

最后解释一句:
好几年没发过帖了,不太适应这种氛围,请见谅。



首先我要承认一下,我忽略了不会溢出。

剩下的我没什么好说的了,你的回帖中的态度已经表达了一些东西,至于你最后那个“自我批评”也只是你自己哄自己玩罢了。

最后说个体内话,至于你的MD5+salt,随机数+密码已经足够,后面的完全是多此一举。




嘿嘿,你不接着挖苦几句是不会甘心的。

最后这句话你说的没错,后面是多余的,只为了让输出结果看起来各均匀,可以去掉的。


我只是就是论事,至于挖苦不挖苦,从头到尾都你一个人在纠结到底是我挖苦你了还是你挖苦我了,跟你在这里争论技术的东西就感觉跟个老娘们在菜市场吵嘴一样。这没想到让我赶上你这么一“中国特色”的程序员。

给你一个忠告,既然你都好几年没发帖子了,我觉得你可以继续保持这种“沉默”。




同学,我的回复都有理有据有代码的,以事实说话的,你要定性为吵嘴那就算了。本来想给你留点面子,看你这气急败坏的样子,我就再给你总结一下你这有“外国特色”的程序员的水准:
1、对性能度量不了解
2、对内存溢出不了解
3、有阅读障碍,明明没有歧义都理解出歧义来了
4、对StringBuilder不了解

就这样,你也好意思以facebook为性能参考?还好意思飙单词装不懂翻译。你也好意思出来给别人忠告?我敬谢不敏。

真心后悔搭理你了,斯文扫地。
0 请登录后投票
   发表时间:2012-10-29  
口水贴了,LZ分享不错。

问个其他问题,如果是一个客户端与服务端交互,密码需要MD5+盐值。那盐值需要固定在客户端了。

有没有其他更好的解决方案。

像lz所说搞个随机数,那意味着这个随机数要服务端生成,还是需要客户端与服务端交互一次来获取哦,或者客户端生成随机数,但也需要通知服务端。
0 请登录后投票
   发表时间:2012-10-29  
swen00 写道
口水贴了,LZ分享不错。

问个其他问题,如果是一个客户端与服务端交互,密码需要MD5+盐值。那盐值需要固定在客户端了。

有没有其他更好的解决方案。

像lz所说搞个随机数,那意味着这个随机数要服务端生成,还是需要客户端与服务端交互一次来获取哦,或者客户端生成随机数,但也需要通知服务端。


其实没关系的,在这个小算法里,盐值是公开的,不管随机数是由哪一端生成的,都可以校验,因此不需要单独保存盐值。
0 请登录后投票
   发表时间:2012-10-29  
wyuch 写道
lonelybug 写道
wyuch 写道
lonelybug 写道
wyuch 写道
lonelybug 写道

第一,我开1g内存就是因为我需要防止1亿次的调用产生heap overflow,当然用加号的会先益处。
第二,看图的话你明显看出gc对于加号所做的回收工作更频繁,而且波形幅度更大(超过c cup,哈哈哈,邪恶一下),这说明每次回收所花费时间相对更多,vm锁死频率和时间都相对的大。
第三,关于你做的测试"一个比较好的测试方法时加一个JVM参数-Xmx10m,让两种方法都在10M heap里运行1亿次。我的测试结果(10万次)如下: ",这个测试命题很诡异。你测时间复杂度用100万,然后空间复杂度建议一亿,但最后你侧的是10万。我实在不知道你要测啥?最坏,最好,还是平均。

关于时间复杂度的你所谓的忽略不计。我觉得你的结论更武断一些,时间复杂度对于这个算法我们假设O(n)=cn,c是常数(16)也就是说时间复杂度函数中最高order(不好意思中文不会翻译)是n。拿我想知道你的忽略不计是说的O(0)么?


第一,永远不会溢处,1万亿次都不会。
第二,会有多大影响,用-Xmx10m就可以反映,人为地heap设得很小让gc频繁进行都只有千分之一的差距。
第三,测1万亿次都行呀,但我等不及拿结果呀,我机器跑10万次都要跑11秒,你可以自己试1亿次,两种方式差距是一样一样的。

关于时间复杂度,你的理解真是让人无语,忽略不计肯定是指两种算法之间的差距可以忽略不计。我都特意列出了执行10万次的毫秒数了,然后问“是不是可以忽略不计?”,结果你理解成了O(0)。你不能尽想着别人特傻特没常识,尽往这个方向上理解,然后自说自话吧?而且我的话没有歧义呀。

好了,我觉得我们可以不用讨论这个了,意气了哈。我自我批评一下

1、代码得更严谨,同学们的要求是很严格的,不能随便。
2、同学们提出来有问题的地方,差千分之一也是差,我应该立即改掉。
3、不能挖苦lonelybug同学,虽然他也控苦我(最多是挖苦吧,诋毁什么的大严重了)。

最后解释一句:
好几年没发过帖了,不太适应这种氛围,请见谅。



首先我要承认一下,我忽略了不会溢出。

剩下的我没什么好说的了,你的回帖中的态度已经表达了一些东西,至于你最后那个“自我批评”也只是你自己哄自己玩罢了。

最后说个体内话,至于你的MD5+salt,随机数+密码已经足够,后面的完全是多此一举。




嘿嘿,你不接着挖苦几句是不会甘心的。

最后这句话你说的没错,后面是多余的,只为了让输出结果看起来各均匀,可以去掉的。


我只是就是论事,至于挖苦不挖苦,从头到尾都你一个人在纠结到底是我挖苦你了还是你挖苦我了,跟你在这里争论技术的东西就感觉跟个老娘们在菜市场吵嘴一样。这没想到让我赶上你这么一“中国特色”的程序员。

给你一个忠告,既然你都好几年没发帖子了,我觉得你可以继续保持这种“沉默”。




同学,我的回复都有理有据有代码的,以事实说话的,你要定性为吵嘴那就算了。本来想给你留点面子,看你这气急败坏的样子,我就再给你总结一下你这有“外国特色”的程序员的水准:
1、对性能度量不了解
2、对内存溢出不了解
3、有阅读障碍,明明没有歧义都理解出歧义来了
4、对StringBuilder不了解

就这样,你也好意思以facebook为性能参考?还好意思飙单词装不懂翻译。你也好意思出来给别人忠告?我敬谢不敏。

真心后悔搭理你了,斯文扫地。


哈哈。谢谢你,让我领教了你的”斯文“!





0 请登录后投票
   发表时间:2012-10-29  
这个方法没什么实际意义,避免不了重复攻击。

我只要重复两三次后,就找到你的规律了
0 请登录后投票
   发表时间:2012-12-21  
引用
2、作者假定,能够拿到一个应用中用户密码的MD5摘要的人,也能获得该应用的密码摘要形成的算法,以及该算法依赖的外部因素(持久层中的用户ID、用户名、加盐规则、随机数据等)。因此不管是什么样的算法(例如多次MD5以及各种加盐规则),破解者都可以通过将手头的MD5反查库根据你的算法和数据重新运算一遍,以获得针对你的用户数据库的专用的MD5反查库,然后再逐一反查密码明文。


不明白lz想表达的什么意思。算法,用户名,盐,加密数据等都拿到了,还有什么密码不能破解的?而且你在第5点中也说了:
引用
不管采用什么加盐算法,只要算法可以获得,则破解者都可以破解任意一个用户的密码的明文(准确地说是验证该密码是否在MD5反查库中存在,如果存在则能获得明文。


一般来说,算法是不太可能被人获取的(除了MD5这些公开的算法,通常算法代码和数据库所在的服务器是分开的,而且有可能代码还不是以源代码方式放在服务器上)。比如你的代码中的把salt洒落到md5串中的这个算法就不太可能被拿到。如果拿到了,那么也就被破解了。
0 请登录后投票
   发表时间:2012-12-21   最后修改:2012-12-21
Y:破解者创建多个用户,密码都一样(例如123456)

对一些观点我的看法
1、多次MD5
简单的多次MD5是没用的,使用Y,然后根据拖库中的md5字符串就可以知道你是多次MD5了(因为你不可能做很多次,这个要考虑性能问题)

2、MD5后打乱顺序
固定打乱的话,也能猜测出密码,使用Y;随机打乱的话如何确保校验时也能使用相同的随机算法,使得校验一致

3、MD5后截取部分
同上

4、所有用户用一个固定的salt
容易被猜出,使用Y,用和不用没多大差别

5、MD5(username + password),把username当salt使用,但这个salt是明文的,问题是你的库都被人家拖了,还能不知道你的username?使用Y,和MD5(password)完全没有区别。你以为加个字符串就是salt啊。

6、MD5(username + password)后截取固定长度
同上

7、password和security,security相当于用户的salt,只是这个salt由用户填写,而不是系统决定
这个如果有干扰算法的话,肯定没有问题;如果没有的话,应该是没问题。不过现实当中如果你让用户填写password和security的话,用户非常容易把这两个设置成一样的,这样就有了一个漏洞。

MD5算法不可逆,也就是你找不到和MD5相反的算法,但MD5是可以通过彩虹表方法来破解的。

结合上面所述,密码使用hash方式保存要求:
  • 必须加salt,并且salt必须保密,不能是明文;
  • 每个用户必须使用不同的salt;
  • 有干扰算法的话,干扰算法也必须保密;
  • 当然,最后还有性能问题,速度要快。


lz的代码还是很给力的,具体使用的时候还可以把3改成4、5、6等,还有随机生成16位数字也可以改成随机生成16位字符,这样更复杂了点。性能可能也要做一些优化。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics