我如何创建密码,当直接用md5散列(不加盐)时,该密码将返回包含8个字符“ SALT ME!”的字符串。希望天真的开发人员浏览其用户数据库将看到“哈希”,意识到其应用程序的不安全性,并最终使每个人的世界变得更好。这是16个字节。如果我有一个16字节的消息,则获得原始的纯文本密码将等效于一个原映像,据我所知,这实际上是不可能的。但是,我只在哈希中查找8个特定的字节。

在典型计算机上的白天时段获得这样的密码是否可行?如果是这样,我该如何计算这样的密码?

评论

我立即想到的是,如果您将MD5用作密码哈希算法,则不是最大的问题。

-1,因为这样做的既定目的不仅荒谬,而且甚至行不通。也不属于该站点:该问题本质上是在询问有关计算特定哈希的问题,并且更适合StackOverflow或SuperUser。

或CodeGolf ...

几乎没有管理员通过密码数据库读取所有密码。否则数据库应该已经遭到破坏,您的“ Salt me”应该从其他地方脱颖而出...下面给出的所有示例均依赖于哈希的Base64表示,而大多数MD5哈希均表示为十六进制

总红鲱鱼。如果您不减轻离线暴力搜索的压力,咸化将不会节省您的背面。使用scrypt或bcrypt或类似的东西,没有ifs或buts。

#1 楼

MD5的输出是二进制的:一个128位的序列,通常编码为16个字节(技术上为16个八位位组,但让我们使用字节为八位位组的通用约定)。

人类不读取位或字节。他们读字符。有许多代码页告诉您如何将字符编码为字节,以及如何将字节解码为字符。对于几乎所有字符(由于ASCII),低值字节(0到31)都是“控制字符”,因此实际上不能表示为字符。因此,没有人真正直接读取MD5输出。如果有人在“读取”哈希值,则很可能会使用几种常用的约定之一将这些值编码为字符。两种最流行的约定是十六进制和Base64。使用十六进制时,只有数字和字母'a'至'f'(哈希值在传统上为小写)。您不会收到“盐我!”在十六进制输出中...

使用Base64,编码使用所有26个不加重的拉丁字母(小写和大写),数字以及'+'和'/'符号。因此,您可以希望使用“ SaltMe”或“ SALTME”。现在这是可行的,因为Base64中的每个字符都编码6位,因此6个字母的输出仅对应于36位。查找产生“ SaltMe”或“ SALTME”密码的操作(平均)需要进行235次尝试,即在几分钟或几小时内使用一些经过优化的代码。

但是请注意,实际上花一些时间读取Base64编码的哈希值的某个人可能会有一些“社会问题”,因此可能无法按照您希望的方式做出反应。

它完成了:使用MD5进行哈希处理时,然后对结果进行Base64编码:



>


评论


经过一整天的工作后,没有什么比喝一杯酒和读取一些base64编码的哈希值让我感到放松了。

–安倍·米斯勒(Abe Miessler)
2014年4月22日在17:01

即使您没有找到两个产生SALTME作为前6个字符的输入,我也必须对此投票。这样做的好处不只是+1,但是,a,这就是我所能提供的。神奇的回答朋友!

–迈克·佩伦努德(Mike Perrenoud)
2014年4月22日在18:03

NoMD5只有五个字母;我们可以转到6并获得看起来更好的NoMD5 +。而且,的确,pmcrsihh产生NoMD5 + pyhpe6Xxa3x93iGQ ==。

–汤姆韭菜
2014年4月22日在18:45

残酷地...我从这里开始执行MD5,然后输入了许多8个字母的密码,直到获得正确的输出为止。在我的3.1 GHz服务器上,每个内核每秒大约进行2 ^ 23次尝试(我估计我可以使用一些SSE2感知代码来完成2 ^ 24次-我曾经为SHA-1做到过一次)。

–汤姆韭菜
2014年4月22日19:13在

当我看到SALTMEnBrODYbFY0c / tf + Q ==时,我想到的第一件事是...。大声笑

–梯形
14年4月22日在23:35

#2 楼

纯粹从理论上来说...

彩虹表集带有预先计算的哈希值。您可以在其中搜索包含适当字节值的哈希值(编辑:将需要对预生成的完整散列进行强行破解,并进行探测使其更加困难-请参见bonsaiviking对答案的评论)(如果存在) (例如,包含0xBADBAD的一个)。如果存在,则可以从rainbow表本身中获取哈希值的原始明文(如果使用该密码,那么根据定义,它是不安全的,因为获取数据库的任何人都可以将其反向,并且因此不建议使用。)

实际上,....

这种方法有很多假设。


在如果组织规模不大,则开发人员通常无法访问生产数据库,除非个别进行故障排除。
您假设MD5以某种人类可读格式存储/显示;但是它只是一个16字节的字节数组,实际上取决于开发人员/ IT人员将其可视化所使用的软件。例如,在Visual Studio中,调试器通常会按其数值显示字节数组,例如87,45,34,67 ... br />正如其他人已经建议的那样,您不知道它的存储方式,因为可能对其进行了一些其他转换(例如,像Base64),这会使它看起来有所不同。

但主要的最大假设是,某人正在浏览成千上万的用户数据库,并且会从一堆哈希值中发现奇数值,甚至从哈希的一部分中发现奇数。

评论


Rainbow表不会存储所有哈希,因此您不能只是“搜索它们”。它们是一种特殊的压缩格式,用于为特定的整个输入哈希查找明文,因此,您必须不断生成“令人满意的”哈希,直到获得带有“真实”明文的哈希为止。

–bonsaiviking
2014年4月22日在17:15

@bonsaiviking你是对的-我什至没有意识到。使整个工作变得更加困难...

– LB2
2014年4月22日在17:32

“除了可能的个别故障排除案例外,开发人员通常无权访问生产数据库”,我认为这是对该问题的唯一明智答案。我认为获得最终结果的可能性很小,即使那样也不会改变别人的想法。

– Niels Bom
2014年4月24日13:43

“ Pass2112127”散列为“ badbad3aad02eeb05be660c5bb30efe5”。

– tobyink
2014年4月24日在22:13

“ pwd9383247”散列为“ bad7ca3eb9307233f790a9d4a4a0bbad”,其开头和结尾均为“坏”。

– tobyink
2014年4月24日在22:23

#3 楼

8字节是64位,这超出了蛮力。我不知道对md5的任何原像攻击,因此您可能不走运。

此外,某些网站转义或限制了字符集作为对SQLI的(无效)措施

评论


既然它超出了蛮力,您是否每次机会使用64位哈希?

–李凯文
2014年4月22日在17:21

除了上面的答案是蛮力外,它还不是蛮力的。

– corsiKa
2014年4月22日19:18

@corsiKa接受的答案用暴力手段强行使用“ SaltMe”或“ SALTME”,而不是要求的“ SALT ME!”。 6个字符与8个字符之间的差异在这里非常重要。

–麦克·斯科特(Mike Scott)
2014年4月22日19:38在

他能够在一台机器上不到一个小时的时间完成操作,包括设置应用程序。添加一个字符大约需要2天,这非常合理。考虑到没有进行太多的优化(答案估计他可以通过良好的优化使其速度提高大约10倍),并且某个设置只是将类似的东西放在一起的人可能有几台机器可以并行化它,看来密码可以一两周内就被强暴。对于OP只需一次就可以肯定可行。

– corsiKa
2014年4月22日19:51

除了他强行使用了6个6位字符2 ^ 36,这远远小于8位的“ SALTME”(2 ^ 48)

–miniBill
14年4月23日在6:30