【问题标题】:MD5 hash in android or javaandroid或java中的MD5哈希
【发布时间】:2014-07-24 09:15:02
【问题描述】:

我需要在 MD5 哈希中转换字符串。

我正在使用

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(bytesOfMessage);

final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
    public static String bytesToHex( byte[] bytes )
    {
        char[] hexChars = new char[ bytes.length * 2 ];
        for( int j = 0; j < bytes.length; j++ )
        {
            int v = bytes[ j ] & 0xFF;
            hexChars[ j * 2 ] = hexArray[ v >>> 4 ];
            hexChars[ j * 2 + 1 ] = hexArray[ v & 0x0F ];
        }
        return new String( hexChars );
    }

它正在像这个网站http://www.md5.cz/提供输出

但我需要生成哈希,因为 http://webcodertools.com/hashstring 给出输出。

请在两个站点中使用 test

通过使用上述功能,我得到了像第一个站点一样的 o/p,但我需要第二个站点提供。

有什么不同的功能还是我错过了什么?

谢谢。

【问题讨论】:

    标签: java android encryption md5


    【解决方案1】:

    第二个网站只是使用 base64 而不是十六进制来将二进制数据表示为文本。所以你可以完全摆脱你的bytesToHex 方法,而只使用Base64

    String base64Digest = Base64.encodeToString(thedigest, Base64.DEFAULT);
    

    (顺便说一句,我会避免在变量名中使用 the 作为前缀 - 它没有任何好处,而且很笨拙。)

    【讨论】:

    • 我已根据您的建议更改了代码.. 并且工作正常...非常感谢 :)
    • 我认为应该使用Base64.NO_WRAP 而不是Base64.DEFAULTBase64.DEFAULT 将在 base64 字符串的末尾生成换行符。
    【解决方案2】:

    使用这个方法会以同样的格式返回

    public static String getMd5Hash(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] messageDigest = md.digest(input.getBytes());
            BigInteger number = new BigInteger(1, messageDigest);
            String md5 = number.toString(16);
            while (md5.length() < 32)
               md5 = "0" + md5;
            return md5;
            } catch (NoSuchAlgorithmException e) {
             Log.e("MD5", e.getLocalizedMessage());
          return null;
        }
        }
    

    这将返回 //4a2028eceac5e1f4d252ea13c71ecec6 格式 MD5 的“WHAT”和

    String base64format =  Base64.encodeToString(thedigest, Base64.DEFAULT); //as given by @Jon Skeet
    

    将以 SiAo7OrF4fTSUuoTxx7Oxg==

    的格式返回

    抱歉,反之亦然。

    【讨论】:

    • 不,这将返回十六进制,这是 OP 的代码已经以一种更好的方式 IMO 所做的。根据第二个链接,OP 想要它在 base64 中。此外,当示例代码显示字节时,您的答案假定 OP 将数据作为字符串,并使用平台默认编码将该文本转换为字节。最后,如果缩进得当,你的代码会更容易阅读。
    猜你喜欢
    • 1970-01-01
    • 2020-12-08
    • 2011-06-18
    • 2015-12-21
    • 1970-01-01
    • 2014-05-19
    • 2014-11-09
    • 2012-08-17
    相关资源
    最近更新 更多