【问题标题】:How do I check if a string is a valid md5 or sha1 checksum string如何检查字符串是否为有效的 md5 或 sha1 校验和字符串
【发布时间】:2010-12-26 04:27:34
【问题描述】:

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

【问题讨论】:

    标签: java md5 sha1 checksum


    【解决方案1】:

    任何 160 位序列都是可能的 SHA1 哈希。任何 128 位序列都是可能的 MD5 哈希。

    如果您正在查看它们的十六进制字符串表示,那么 sha1 看起来像 40 个十六进制数字,而 md5 看起来像 32 个十六进制数字。

    【讨论】:

    • 所以分别检查 40 位和 32 位十六进制数
    • 这个答案更好,因为它解释了原因。
    【解决方案2】:

    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}$");
    }
    

    【讨论】:

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

    MD5 验证器:

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

    并去掉字符串值的“-”。

    【讨论】:

      【解决方案4】:

      正则表达式 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...");
      

      【讨论】:

        【解决方案5】:

        没有像 MD5 或 SHA-1 字符串这样的东西,至少没有标准化的字符串。您可以测试的只是字节数组的大小:MD5 为 16(输出大小为 128 位的散列)或 SHA-1(输出大小为 160 位的散列)为 20 个字节,使用十六进制编码或base 64 编码。

        如果您使用md5sum,则校验和通常显示为十六进制编码,仅使用 小写字符(后跟文件名或- 用于标准输入)。通常首选十六进制,但哈希也可能包含分隔符或使用不同的编码,例如 base 64 或 base 64 URL(等等)。

        但是,您正在测试的字节大小可能属于完全不同的哈希值,例如 RIPEMD,它也可能具有相同的输出大小。或者它可能是具有相同字节数的另一个值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-13
          • 2018-02-02
          • 1970-01-01
          • 2011-06-17
          • 1970-01-01
          • 2011-02-26
          • 2021-10-03
          相关资源
          最近更新 更多