【问题标题】:getting a negative value on md5在 md5 上获得负值
【发布时间】:2023-12-06 03:22:01
【问题描述】:

我正在尝试使用 java 获取 MD5,但我收到了一个负值。 MD5 可以产生负值吗?

这是我的代码:

        MessageDigest md5 = MessageDigest.getInstance("MD5");
        byte[] sigBytes = md5.digest((sharedSecret+"api_key"+API_KEY).getBytes());
        api_sig = new BigInteger(sigBytes).toString(16);

谢谢。

【问题讨论】:

  • @Vache - 这是 Java,不是 C#。
  • 哇,对不起,我不应该在我刚醒来时投票关闭。

标签: java md5


【解决方案1】:

new BigInteger(sigBytes) 将您的签名解释为有符号整数,所以是的,有可能得到一个负数。如果您希望您的字符串包含 md5 值的十六进制表示形式,请在此处查看一些答案:How can I generate an MD5 hash?

【讨论】:

  • toString(16) 是获取十六进制表示的坏方法吗?
【解决方案2】:

正如jbowes 所暗示的,new BigInteger(sigBytes) 将签名解释为有符号整数(意味着第一位表示数字是正数还是负数)。如果您希望它将字节解释为无符号数,则应改用new BigInteger(1, sigBytes)

【讨论】:

    【解决方案3】:

    我使用以下方法来获得正确的 MD5 哈希字符串(它从未给我“负”值):

    public static String createMD5Hash(String input) {
        try {
            MessageDigest m = MessageDigest.getInstance("MD5");
            byte[] out = m.digest(input.getBytes());
            return new String(Base64.encodeBase64(out));
        } catch (NoSuchAlgorithmException e) {
            return null;
        }
    }
    

    注意 Base64 是 apache commons 的类:

    import org.apache.commons.codec.binary.Base64;
    

    【讨论】: