【问题标题】:Passing a Base64 encoded String into sha512 function gives different result than when hard coded将 Base64 编码的字符串传递给 sha512 函数会产生与硬编码时不同的结果
【发布时间】:2017-01-25 23:38:43
【问题描述】:

我正在 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 编码字符串进行硬编码。我不知道为什么。 这只是主要活动,没有执行其他代码。

【问题讨论】:

    标签: java android hash base64 sha


    【解决方案1】:

    看起来像你的字符串

    b
    

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

    “VGVzdDox”和

    "VGVzdDox

    "

    第一个的输出是:

    3553AF9EDC389314B0F7354B51FEA7EB089C039EA77A0FD7BD61798A8DD14B1292B353B9E00789B2698B072AF5B05417DDDAA1870ADF9E1DE9C1F96D9465DF56
    

    第二个的输出是:

    A7D1BDC5D6497D787B35CE52774365150A2E21084958FFC14570367F3764B938FC1191D06006F1908084518C9697CBFF3F2830A1AC003EF8ACE36A0667DCE92D
    

    所以也许用 Stirng.trim() 方法去掉行分隔符,但我没有测试它

    【讨论】:

    • 我也这么认为。我使用编码函数中的标志 Base64.NO_WRAP 将其输出到一行。
    【解决方案2】:

    找到了,不得不改:

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

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

    【讨论】:

      猜你喜欢
      • 2018-09-13
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多