将 Base64 编码的字符串传递给 sha512 函数会产生与硬编码不同的结果
Passing a Base64 encoded String into sha512 function gives different result than when hard coded
我在 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 编码的字符串进行硬编码时也是正确的。我不知道为什么。
这只是主要的activity,没有执行其他代码。
找到了,不得不改:
return Base64.encodeToString(enc, Base64.DEFAULT);
到
return Base64.encodeToString(enc, Base64.NO_WRAP);
看起来像你的字符串
b
末尾有一个新行,我用带有字符串的在线 sha 512 生成器对其进行了测试:
"VGVzdDox" 和
"VGVzdDox
"
第一个的输出是:
3553AF9EDC389314B0F7354B51FEA7EB089C039EA77A0FD7BD61798A8DD14B1292B353B9E00789B2698B072AF5B05417DDDAA1870ADF9E1DE9C1F96D9465DF56
第二个输出是:
A7D1BDC5D6497D787B35CE52774365150A2E21084958FFC14570367F3764B938FC1191D06006F1908084518C9697CBFF3F2830A1AC003EF8ACE36A0667DCE92D
所以可以使用 Stirng.trim() 方法去掉行分隔符,但我没有测试它
我在 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 编码的字符串进行硬编码时也是正确的。我不知道为什么。
这只是主要的activity,没有执行其他代码。
找到了,不得不改:
return Base64.encodeToString(enc, Base64.DEFAULT);
到
return Base64.encodeToString(enc, Base64.NO_WRAP);
看起来像你的字符串
b
末尾有一个新行,我用带有字符串的在线 sha 512 生成器对其进行了测试:
"VGVzdDox" 和
"VGVzdDox
"
第一个的输出是:
3553AF9EDC389314B0F7354B51FEA7EB089C039EA77A0FD7BD61798A8DD14B1292B353B9E00789B2698B072AF5B05417DDDAA1870ADF9E1DE9C1F96D9465DF56
第二个输出是:
A7D1BDC5D6497D787B35CE52774365150A2E21084958FFC14570367F3764B938FC1191D06006F1908084518C9697CBFF3F2830A1AC003EF8ACE36A0667DCE92D
所以可以使用 Stirng.trim() 方法去掉行分隔符,但我没有测试它