Hash MD5散列中可以只有数字还是只有字母?

Hash MD5散列中可以只有数字还是只有字母?,hash,md5,crypt,Hash,Md5,Crypt,我一直在研究,但我一无所知。 我知道MD5既可以有数字也可以有字母,但如果我发现MD5只有数字或字母,它会破坏我当前的脚本MD5是一个好的哈希函数(当前已破坏,不应用于安全应用程序)这意味着它会产生随机的输出,以便利用适合输出空间的所有可能值。这些字母和数字是输出的十六进制表示。是的,有时您可以获得仅由字母或数字组成的输出,但大多数情况下,您将同时获得这两种输出 如果我必须解析MD5的十六进制表示,那么我肯定会花时间来支持这些非常罕见的情况,即输出仅为字母或数字。我相信您正在使用MD5哈希的十六

我一直在研究,但我一无所知。
我知道MD5既可以有数字也可以有字母,但如果我发现MD5只有数字或字母,它会破坏我当前的脚本

MD5是一个好的哈希函数(当前已破坏,不应用于安全应用程序)这意味着它会产生随机的输出,以便利用适合输出空间的所有可能值。这些字母和数字是输出的十六进制表示。是的,有时您可以获得仅由字母或数字组成的输出,但大多数情况下,您将同时获得这两种输出


如果我必须解析MD5的十六进制表示,那么我肯定会花时间来支持这些非常罕见的情况,即输出仅为字母或数字。

我相信您正在使用MD5哈希的十六进制表示。MD5哈希实际上是128位字符串。大多数工具使用十六进制表示法打印它们,十六进制表示法相当于32位十六进制数字。十六进制数字使用0-9和a-f

例如:

susam@swift:~$ echo -n "foo" | md5sum
acbd18db4cc2f85cedef654fccc4a4d8  -

你有32位数字。如果我们假设所有密码平均分布,则有10^32个组合,仅由数字密码组成,6^32个组合仅由字母密码组成,总共有16^32个组合

这使得脚本在每次调用时失败的概率为(10^32+6^32)/16^32

 echo "scale=10;(10^32 + 6^32) / 16^32" |  bc 
.0000002938

因此,在大约340万个案例中,它将失败一次。你想多久使用一次

理论上,MD5哈希(转换为十六进制字符串时)只能包含十进制数字或字母

实际上,也是肯定的:字符串
ximaz
产生的MD5哈希值为
61529519452809720693702583126814


(感谢您的示例)

仅给出数字md5哈希的前几个字符串的列表:

ximaz : 61529519452809720693702583126814 
aalbke : 55203129974456751211900188750366 
afnnsd : 49716523209578759475317816476053 
aooalg : 68619150135523129199070648991237 
bzbkme : 69805916917525281143075153085385 
这里有一个只有字母的:

cbaabcdljdac : cadbfdfecdcdcdacdbbbfadbcccefabd

我知道这是一个非常古老的问题,但我在md5哈希中发现了另外三个只有数字的字符串,而Google在搜索这些哈希时找不到任何东西,所以我认为可能值得发布以下内容:

Ioktak : 54948232518148653519995784773259
'99x\`b0x\'b : 24034969117462298298932307218853
uttuJ## : 74616072929762262275291990931711

MD5哈希(也称为消息摘要)通常表示为32个十六进制数字的序列。那有什么问题?建议您发布代码/示例…因此,哈希的常用字符串表示形式可能只包含字母或十进制数字。绝对有效和可能。就像十进制数可能只包含奇数一样。MD5“应被视为密码错误,不适合进一步使用,”马克:将是十六进制数字0-9a-F:你的问题是什么?目前我正在处理md5,但一旦我使用它,我将使用更好的哈希函数md5@Mitch麦特:在没有安全顾虑的情况下不需要。@Mitch麦特:例如,对于数据标识:CRC不行-它的输出太窄。MD5是一个可破解的哈希函数。除非你添加了盐,否则你不应该使用它,否则结果(大多数时候)很容易被彩虹表破坏。虽然这不是问题的范围,但如果我们讨论的是好的散列函数,请使用SHA。@Brain2000:并不是所有的SHA函数在加密方面都是好的-SHA-1也被破坏了。@Mitch Wheat:我的意思是,在某些情况下,没有攻击者,散列冲突只能是随机的。这是一个很好的观点(通常但不太经常)我想我真正的问题是,我试图使用sed只返回由两部分组成的表达式的第一部分(第一部分将是md5),我有:sed的/([a-z,0-9]*)./\1/,但是如果第一个表达式只有字母或数字,有没有办法做到这一点?(每次md5之后都会有一个空格)正则表达式看起来不错,但我认为不需要尾随。*因为这将匹配任意数量的字符。如果sed不能正确使用[a-z,0-9]*您也可以尝试(([a-z]|[0-9])*)正则表达式的一个小改进是
's/^([a-z0-9]{32})。*/\1/'
,它明确要求32位。逗号并不像你想象的那样。