锁定老帖子 主题:一种简单的给MD5加盐算法
精华帖 (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为性能参考?还好意思飙单词装不懂翻译。你也好意思出来给别人忠告?我敬谢不敏。 真心后悔搭理你了,斯文扫地。 |
|
返回顶楼 | |
发表时间:2012-10-29
口水贴了,LZ分享不错。
问个其他问题,如果是一个客户端与服务端交互,密码需要MD5+盐值。那盐值需要固定在客户端了。 有没有其他更好的解决方案。 像lz所说搞个随机数,那意味着这个随机数要服务端生成,还是需要客户端与服务端交互一次来获取哦,或者客户端生成随机数,但也需要通知服务端。 |
|
返回顶楼 | |
发表时间:2012-10-29
swen00 写道 口水贴了,LZ分享不错。
问个其他问题,如果是一个客户端与服务端交互,密码需要MD5+盐值。那盐值需要固定在客户端了。 有没有其他更好的解决方案。 像lz所说搞个随机数,那意味着这个随机数要服务端生成,还是需要客户端与服务端交互一次来获取哦,或者客户端生成随机数,但也需要通知服务端。 其实没关系的,在这个小算法里,盐值是公开的,不管随机数是由哪一端生成的,都可以校验,因此不需要单独保存盐值。 |
|
返回顶楼 | |
发表时间: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为性能参考?还好意思飙单词装不懂翻译。你也好意思出来给别人忠告?我敬谢不敏。 真心后悔搭理你了,斯文扫地。 哈哈。谢谢你,让我领教了你的”斯文“! |
|
返回顶楼 | |
发表时间:2012-10-29
这个方法没什么实际意义,避免不了重复攻击。
我只要重复两三次后,就找到你的规律了 |
|
返回顶楼 | |
发表时间:2012-12-21
引用 2、作者假定,能够拿到一个应用中用户密码的MD5摘要的人,也能获得该应用的密码摘要形成的算法,以及该算法依赖的外部因素(持久层中的用户ID、用户名、加盐规则、随机数据等)。因此不管是什么样的算法(例如多次MD5以及各种加盐规则),破解者都可以通过将手头的MD5反查库根据你的算法和数据重新运算一遍,以获得针对你的用户数据库的专用的MD5反查库,然后再逐一反查密码明文。
不明白lz想表达的什么意思。算法,用户名,盐,加密数据等都拿到了,还有什么密码不能破解的?而且你在第5点中也说了: 引用 不管采用什么加盐算法,只要算法可以获得,则破解者都可以破解任意一个用户的密码的明文(准确地说是验证该密码是否在MD5反查库中存在,如果存在则能获得明文。
一般来说,算法是不太可能被人获取的(除了MD5这些公开的算法,通常算法代码和数据库所在的服务器是分开的,而且有可能代码还不是以源代码方式放在服务器上)。比如你的代码中的把salt洒落到md5串中的这个算法就不太可能被拿到。如果拿到了,那么也就被破解了。 |
|
返回顶楼 | |
发表时间: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方式保存要求:
lz的代码还是很给力的,具体使用的时候还可以把3改成4、5、6等,还有随机生成16位数字也可以改成随机生成16位字符,这样更复杂了点。性能可能也要做一些优化。 |
|
返回顶楼 | |