将Base64编码的字符串传递给sha512函数会产生与硬编码时不同的结果

时间:2017-01-25 15:28:26

标签: java android hash base64 sha

我在Android Studio编码,我正在尝试创建base64编码和sha512哈希字符串。

功能是:

private String getBase64(String data){

    try{

        byte[] enc = data.getBytes("UTF-8");
        return Base64.encodeToString(enc, Base64.DEFAULT);

    }catch (Exception e){
        e.printStackTrace();
        return null;
    }

}

private String getSHA(String data){

    try {

        MessageDigest mda = MessageDigest.getInstance("SHA-512");
        byte[] digesta = mda.digest(data.getBytes("UTF-8"));

        return convertByteToHex(digesta);

    }catch(Exception e){
        e.printStackTrace();
        return null;
    }
}


public String convertByteToHex(byte data[]) {
    StringBuilder hexData = new StringBuilder();
    for (byte aData : data)
        hexData.append(String.format("%02x", aData));
    return hexData.toString();
}

然后打电话给他们:

    // line below prints VGVzdDox as it should
    Log.d("GO", "Working Base64: " + getBase64("Test:1"));

        // line below prints: 3553AF9EDC389314B0F7354B51FEA7EB089C039EA77A0FD7BD61798A8DD14B1292B353B9E00789B2698B072AF5B05417DDDAA1870ADF9E1DE9C1F96D9465DF56
    // as it should
    Log.d("GO", "Working SHA: " + getSHA("VGVzdDox"));


    String b = getBase64("Test:1");

    // line below prints VGVzdDox again, as it should
    Log.d("Base64", b);

    String s = getSHA(b);

    // Now this line prints a7d1bdc5d6497d787b35ce52774365150a2e21084958ffc14570367f3764b938fc1191d06006f1908084518c9697cbff3f2830a1ac003ef8ace36a0667dce92d
    // Not sure why?
    Log.d("SHA", s);

所以最后的输出是错误的。但是,getBase64是正确的,getSHA也是在对base64编码的字符串进行硬编码时。我不明白为什么。 这只是主要的活动,没有其他代码被执行。

2 个答案:

答案 0 :(得分:1)

看起来像你的字符串

b

最后有一个新行,我用一个带有字符串的在线sha 512生成器进行了测试:

" VGVzdDox"和

" VGVzdDox

"

第一个的输出是:

3553AF9EDC389314B0F7354B51FEA7EB089C039EA77A0FD7BD61798A8DD14B1292B353B9E00789B2698B072AF5B05417DDDAA1870ADF9E1DE9C1F96D9465DF56

第二个的输出是:

A7D1BDC5D6497D787B35CE52774365150A2E21084958FFC14570367F3764B938FC1191D06006F1908084518C9697CBFF3F2830A1AC003EF8ACE36A0667DCE92D

所以可以使用方法Stirng.trim()摆脱行分隔符,但我没有测试它

答案 1 :(得分:0)

找到它,不得不改变:

return Base64.encodeToString(enc, Base64.DEFAULT);

return Base64.encodeToString(enc, Base64.NO_WRAP);