2017-09-05 93 views
0

我的目标是取一个字符串(本例中为密码)找到它的MD5 Hash,并将其转换为base64。这是我尝试自动登录到浏览器的加密的第一部分。当我测试密码“测试”时,它通过罚款。但是,尝试“asdf”时,我得到不同的哈希值。我知道这是base64转换部分的问题,因为MD5散列总是正确的。您可以通过寻找“ASDF”(912ec803b2ce49e4a541068d495ab570)的MD5哈希看到“正确”的输出并粘贴到这一点的HEX箱here.Base 64转换导致Java Base64库的结果不正确

的链接下面的代码以“测试”带口令https://ideone.com/SmaNsR
链接下面用“ASDF”的代码受密码/ OOSrmV(只能张贴2个链接)

class myClass { 

    public static void main(String[] args) { 
     String password = "asdf"; 
     try { 
      System.out.println(password); 
      password = (passwordencrypt(password)); 
      System.out.println(password); 

     } catch (NoSuchAlgorithmException ex) { 
      System.out.println("oops"); 
     } 
     password = base16to64(password); 

     System.out.println(password); 

    } 

    public static String passwordencrypt(String password) throws NoSuchAlgorithmException { 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     md.update(password.getBytes()); 
     byte[] b = md.digest(); 
     StringBuffer sb = new StringBuffer(); 
     for (byte b1 : b) { 
      sb.append(Integer.toHexString(b1 & 0xff).toString()); 
     } 
     return sb.toString(); 
    } 
    public static String base16to64(String hex){ 
    return Base64.getEncoder().encodeToString(new BigInteger(hex, 16).toByteArray()); 
    } 

} 

编辑:每jrtapsell的推荐,样品输入和输出。

输入: “测试”
我的程序:CY9rzUYh03PK3k6DJie09g ==
它应该是什么:CY9rzUYh03PK3k6DJie09g ==

输入: “ASDF” 我的程序:AJEuyDss5J5KVBaNSVq1cA == 它应该是什么:kS7IA7LOSeSlQQaNSVq1cA ==

+0

您可以添加预期的输入和输出到问题,所以他们可以更容易地比较 – jrtapsell

+3

为什么十六进制编码,然后base64编码? –

+0

@ElliottFrisch MD5已经是base64编码了,所以我想解码它,并用base64编码。如果你问为什么这整个过程,这是因为我正在尝试构建一个可以自动登录到[本网站](https://pschool.aaps.k12.mi.us/public/)的应用程序,而且是该网站传输证书的方式。 我试图做的过程hex_md5> base64_md5 –

回答

2

不要转换为十六进制然后解码十六进制和编码为base64,简化您的代码 - 直接编码为base64。喜欢的东西,

public static String passwordencrypt(String password) 
     throws NoSuchAlgorithmException { 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    md.update(password.getBytes()); 
    byte[] b = md.digest(); 
    return base64(b); 
} 

public static String base64(byte[] bytes) { 
    return Base64.getEncoder().encodeToString(bytes); 
} 

,然后取下调用base16to64main和我

kS7IA7LOSeSlQQaNSVq1cA== 

其中关于相关联的网站以base64字符串相匹配。

+0

哇。这简单得多。标记为已解决。 另外,你不会知道为什么会发生这种情况,对吧?现在并不重要,我有一个更简单的方法来做到这一点,但我仍然好奇。 –

+0

@SampathEaty您的十六进制编码器关闭,或者您的十六进制解码器关闭。但你并不需要任何一个,所以我不会再花更多时间。 –

+0

@SampathEaty可能是以下组合:1.'password.getBytes()'依赖于系统的默认字符集,这在所有操作系统中都不相同。 2. Integer.toHexString返回字节值为0-15的长度为1的字符串。 3.'BigInteger.toByteArray'忽略前导零字节;例如,'new BigInteger(“000”,16).toByteArray()'将返回两个字节,而不是四个。 – VGR