如何检查一个字符串是否是有效的MD5或SHA1校验和字符串?

23

我不想计算文件的校验和,只是想知道一个给定的字符串是否是有效的校验和。

5个回答

63

SHA1 验证器:

public boolean isValidSHA1(String s) {
    return s.matches("^[a-fA-F0-9]{40}$");
}

MD5校验器:

public boolean isValidMD5(String s) {
    return s.matches("^[a-fA-F0-9]{32}$");
}

1
答案中的正则表达式验证字符串长度大于40个字符的字符串,这应该可以解决问题:^[a-fA-F0-9]{40}$ - michaeltintiuc
显然这是旧的,但是根据上面的评论,这两个正则表达式应该锚定在字符串的开头和结尾... - Claire Sannier
2
这并不表示使用的哈希算法,它只是表明哈希输出与哈希算法的大小兼容,并且仅当它以十六进制编码时(这在某种程度上是标准化的,但 base64 也是一种很好的编码方式)才会显示。它也无法检测算法的类型,因为它可能是 RIPEMD160 而不是 SHA-1。它也无法检测是否使用任何空格或分隔符字符。所以要小心;我至少会在文档中清楚地说明函数的作用。 - Maarten Bodewes

15

任何一个由160位构成的序列都可能是SHA1哈希值。任何一个由128位构成的序列都可能是MD5哈希值。

如果你正在查看它们的十六进制字符串表示形式,那么SHA1将会显示40个十六进制数字,而MD5将会显示32个十六进制数字。


3
请分别检查一个40位和32位十六进制数。 - cobbal
这个答案更好,因为它解释了原因。 - Mechanical snail

1
至少目前没有标准的MD5或SHA-1字符串。您可以测试的仅是字节数组的大小:MD5为16个字节(输出大小为128位的哈希),SHA-1为20个字节(输出大小为160位的哈希),使用十六进制编码或base64编码进行编码。
如果使用md5sum,则通常以十六进制编码显示校验和,仅使用小写字符(后跟文件名或“ - ”表示标准输入)。通常首选十六进制数,但哈希值也可能包含分隔符或使用其他编码,例如base64或base64 URL等。
但是,您正在测试的字节大小可能属于完全不同的哈希,例如RIPEMD,它也可能具有相同的输出大小。或者它可能是另一个具有相同字节数量的值。

-1

正则表达式 SHA-1

public static final String SHA_1 = "^([0-9A-Fa-f]{2}[:]){19}([0-9A-Fa-f]{2})$";

public boolean isValidSHA1(String s) {
    return s.matches(SHA_1);
}

boolean isValidSHA1 = isValidSHA1("12:45:54:3A:99:24:52:EA...");

-1

MD5 验证器:

public boolean isValidMD5(String s) {
return s.matches("[a-fA-F0-9]{32}");}

将字符串值中的"-"移除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接