论坛首页 Java企业应用论坛

一种简单的给MD5加盐算法

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

另外,我没明白你要说啥,如果干扰算法公开都可以重构md5库反差,那你做的是什么?如果salt公开了那还叫作salt?我实在没搞懂你的逻辑。


拜托仔细读一读我的帖子吧,求您了。RSA算法听着您的这种逻辑都得哭了。


可惜你做的不是RSA算法,公钥型加密算法和你这个加Salt的MD5有着本质的区别。我不需要再读一遍你的帖子。
我觉得你倒是可以从新看看RSA的介绍文章。


比喻知道吧?你不需要再读一遍,因为你不需要读就可以根据你的强大内心发表评论。也不知道你的“如果salt公开了那还叫作salt”是从哪本书上看到的。


哈哈,你的逻辑彻底让我觉得这里开始有戏剧色彩了。如果salt算法公开了就不叫加salt了。这句话我不需要从哪本书去看。我看你的帖子就行了。因为你非这么大的劲又是随即数。又是混合,我相信你做的就是怕别人猜出来你的salt算法防止建立md5的库吧。

别说,我还真没看出来你用的是比喻手法描述技术辩论,不过这也恰恰证明了我对你适合艺术创造的评价是正确的。

当然,我跟你谈逻辑。你跟我刷嘴皮子。那我就没必要奉陪了z
0 请登录后投票
   发表时间:2012-10-24  
wyuch 写道
lonelybug 写道

你做的测试叫做100万次,不叫做1600万次,因为,每次登录时调用的是整个函数,不是只是单独的一次补零操作。

为了更好的测试你的算法是否真的有效率,我觉得除了时间复杂度方面,我们还需要在空间复杂度上面测试一下。

下面的截图是我在我的i7 3500k 8G内存 heap开1G的情况下跑了你的算法1亿次--我相信很多网站每天的登陆次数远远超过1000万次,比如renren,face*book,weibo,twitter等,当然,作为一个基础工具类的加密算法,我相信很多其他方面也会应用到,比如产生ID或者session key(Open API应用场景),所以,我假设1亿次。

第一个图是用StringBuilder,第二图是+号方法。

很简单可以看出,为了一个加密功能Heap基本要用掉300MB-400MB,而StringBuilder稳定在50MB一下,我相信很多网站对于你的算法所消耗的Heap是不太能承受的。



额,知道换成StringBuilder了。

“你做的测试叫做100万次,不叫做1600万次”。我是说1600万次字符串连接呀,你老是看不清楚。

算法中没有任何地方会请求超过10K的内存,所以我觉得你可以分析一下这样一段简单代码为什么会使用300多M的内存。我的看法:这是因为你的heap相对于这个算法开得很高,GC可以较长一段时间不需要收集,导致看起来算法占用的内存很高,实际上算法运行需要的内存撑死不过几M。加号和StringBuilder这种空间方面的表象实际上依然是一个加号多创建了对象的问题,在考虑内存回收的附加因素后,依然可以归结为时间复杂度。

一个比较好的测试方法时加一个JVM参数-Xmx10m,让两种方法都在10M heap里运行1亿次。我的测试结果(10万次)如下:

使用加号: 11093
使用StringBuilder: 10891
使用StringBuffer: 11000

是不是可以忽略不计?“我相信很多网站对于你的算法所消耗的Heap是不太能承受的。”这很显然是一个想当然的判断。

你关于我的性格的结论是不是有点下得太早了?欢迎你继续发言。



首先先说你对于我测试空间复杂度的辩论,

第一,我开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)么?
0 请登录后投票
   发表时间:2012-10-25  
lonelybug 写道

哈哈,你的逻辑彻底让我觉得这里开始有戏剧色彩了。如果salt算法公开了就不叫加salt了。这句话我不需要从哪本书去看。我看你的帖子就行了。因为你非这么大的劲又是随即数。又是混合,我相信你做的就是怕别人猜出来你的salt算法防止建立md5的库吧。

别说,我还真没看出来你用的是比喻手法描述技术辩论,不过这也恰恰证明了我对你适合艺术创造的评价是正确的。

当然,我跟你谈逻辑。你跟我刷嘴皮子。那我就没必要奉陪了z


你一直就是自己在那“我相信”了,和楼上那位同学一样张冠李戴习惯了。我肯定不怕猜呀,不然我公开干什么呢?引入随机性就是让破解者必须为每一个密码都生成一个反查库,避免出现CSDN那样数据库泄漏后一次性被破解的悲剧。我再重复一遍,你好好看看吧,别说你不需要看哦。

引用

4、因为第3点提到的性能要求,所以根据你的算法重新构建一个专用MD5反查库的时间不会特别长(采用较好的机器和并行计算,可以在有意义的时间范围之内重新形成有100亿条以上记录的MD5反查库)。

5、根据以上2/3/4点,不管采用什么加盐算法,只要算法可以获得,则破解者都可以破解任意一个用户的密码的明文(准确地说是验证该密码是否在MD5反查库中存在,如果存在则能获得明文。特别复杂的密码在MD5反查库中不会有记录,因此即使不加盐也无法破解)。

6、但多次MD5、打乱MD5结果的数位顺序这些算法的安全性要更差一些,便如多次MD5,不管你是几次MD5,破解者只需要根据你算法运算形成MD5反查库,则一次性就破解了你的所有密码。

7、本文中的算法以及MD5(UserName+Password+Salt)、MD5(UserID+Password+Salt)等,是在密码之外有引入了干扰项(称之为盐),因此破解者必须为每一个密码单独形成一个MD5反查库,代价就会非常高,要想破解所有密码实际上已经不可行了。

8、但MD5(UserName+Password+Salt)要求UserName永远不变,MD5(UserID+Password+Salt)要求用户在用户名之外必须有一个不变的UserID。这些额外的要求,导致其适用性没有本文中的算法好。

0 请登录后投票
   发表时间:2012-10-25  
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同学,虽然他也控苦我(最多是挖苦吧,诋毁什么的大严重了)。

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

0 请登录后投票
   发表时间:2012-10-25  
是啊好几年没发...发了个这种..半吊子的帖子....而且没完没了的讨论一些没营养的问题..估计是因为我新手吧..很多看不懂.也插不上话...具体是不知道在说什么..顺着楼上的聊就是跑题...翻来覆去的...而且...算了不说了..我认为可以结贴了..希望楼主..能拿出更好的东西和我们分享..别说(不敢了,没意思等..).希望更多的是技术交流...
0 请登录后投票
   发表时间:2012-10-25   最后修改:2012-10-25
ansjsun 写道
是啊好几年没发...发了个这种..半吊子的帖子....而且没完没了的讨论一些没营养的问题..估计是因为我新手吧..很多看不懂.也插不上话...具体是不知道在说什么..顺着楼上的聊就是跑题...翻来覆去的...而且...算了不说了..我认为可以结贴了..希望楼主..能拿出更好的东西和我们分享..别说(不敢了,没意思等..).希望更多的是技术交流...


别谦虚,你看得很懂,表现有三:
1、能肯定是半吊子
2、能肯定没营养
3、能肯定跑题了
不要装新手了,你就像黑夜中的荧火虫,一定是高手。
0 请登录后投票
   发表时间:2012-10-25  
ansjsun 写道
是啊好几年没发...发了个这种..半吊子的帖子....而且没完没了的讨论一些没营养的问题..估计是因为我新手吧..很多看不懂.也插不上话...具体是不知道在说什么..顺着楼上的聊就是跑题...翻来覆去的...而且...算了不说了..我认为可以结贴了..希望楼主..能拿出更好的东西和我们分享..别说(不敢了,没意思等..).希望更多的是技术交流...


http://www.iteye.com/topic/1127393

我尝试证明一下不是半吊子。
0 请登录后投票
   发表时间:2012-10-25  
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,随机数+密码已经足够,后面的完全是多此一举。


0 请登录后投票
   发表时间:2012-10-26  
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,随机数+密码已经足够,后面的完全是多此一举。




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

最后这句话你说的没错,后面是多余的,只为了让输出结果看起来各均匀,可以去掉的。
0 请登录后投票
   发表时间:2012-10-27  
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,随机数+密码已经足够,后面的完全是多此一举。




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

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


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

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


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

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