[英]Java SHA1 hash to base64 : unsigned bytes?
我試圖在C#和Java中 散列值( SHA1 ),然后返回base64表示。 我得到2個不同的結果。
我知道這是因為Java使用有符號字節而C# 沒有 。
C#版本 :
static public string toSHA1(string toEncrypt)
{
return toSHA1(toEncrypt, new UTF8Encoding());
}
static public string toSHA1(string toEncrypt, Encoding encoding)
{
String salt = "fE4wd#u*d9b9kdKszgè02ep5à4qZa!éi6";
SHA256Managed sha256hasher = new SHA256Managed();
byte[] hashedDataBytes = sha256hasher.ComputeHash(encoding.GetBytes(toEncrypt + salt));
return Convert.ToBase64String(hashedDataBytes);
}
Java版本 :
public static String toSHA1(String toEncrypt) {
return toSHA1(toEncrypt, "UTF-8");
}
public static String toSHA1(String toEncrypt, String encoding) {
String salt = "fE4wd#u*d9b9kdKszgè02ep5à4qZa!éi6";
String res = null;
toEncrypt = toEncrypt + salt;
try {
byte[] dataBytes = toEncrypt.getBytes(encoding);
MessageDigest md = MessageDigest.getInstance("SHA-1");
res = Base64.encodeBytes(md.digest(dataBytes));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return res;
}
我無法找到使用Java獲得正確base64結果的解決方案。
將有符號值轉換為無符號值會強制使用int
數據類型,但只要我將其放入byte
數據類型中,我就會收到帶符號的字節...
Base64.encodeBytes
正在等待一個byte
數組,所以我有沒有辦法將無符號 byte
數組傳遞給這個方法? 我該怎么處理這個int
數組? :
int[] dataInt = new int[dataBytes.length];
// signed to unsigned
for (int i=0; i<dataBytes.length; i++)
{
dataInt[i] = (dataBytes[i] & 0xFF);
}
我無法修改C#版本,我必須調整Java版本才能得到相同的結果。
問題很簡單......來自你的C#代碼:
SHA256Managed sha256hasher = new SHA256Managed()
SHA-256!= SHA-1。 在C#中使用SHA1
類,或者在Java中也使用SHA-256。 由於您顯然無法更改C#代碼,因此您應該更改Java:
MessageDigest md = MessageDigest.getInstance("SHA-256");
完成后,base64編碼的數據應該在兩個平台上都相同。 盡管字節是用Java簽名的,但base64編碼器將它們視為無符號......基本上它們只對這些位感興趣。
我還強烈建議您在源代碼中用ASCII表示您的salt,使用\\uxxxx
轉義為任何非ASCII字符。 這將防止因使用錯誤編碼進行編譯而導致的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.