簡體   English   中英

Java SHA1哈希到base64:無符號字節?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM