簡體   English   中英

在本機反應中將字節數組轉換為 MD5 Hash

[英]Convert an byte array to MD5 Hash in react native

我在 C# 中有一個系統,它接收密碼,並且使用此 function 將此密碼加密為 MD5 Hash。 我已經閱讀了很多帖子和建議,但我無法像在 C# 中那樣創建 MD5 字節數組。

public static string GetMD5HashData(string data)
{
    //create new instance of md5
    MD5 md5 = MD5.Create();

    //convert the input text to array of bytes
    byte[] hashData = md5.ComputeHash(Encoding.Default.GetBytes(data));

    //create new instance of StringBuilder to save hashed data
    StringBuilder returnValue = new StringBuilder();

    //loop for each byte and add it to StringBuilder
    for (int i = 0; i < hashData.Length; i++)
    {
        returnValue.Append(hashData[i].ToString());
    }

    // return hexadecimal string
    return returnValue.ToString();
}

這個 function 的返回是這個字符串207154234292557519022585191701391052252168 我需要在 React Native 中生成相同的字符串。 C# function 中的這部分Encoding.Default.GetBytes(data)我已經在 React native 中重現,因此 C# 和 React native 從輸入字符串返回相同的字節數組

輸入字符串:'system123' 字節數組:'[115, 121, 115, 116, 101, 109, 49, 50, 51]'

React 原生 function 生成字節數組。

convertStringToByteArray = (str) =>{
    var bufferedVal = Buffer.from(str, 'utf8').toString('hex');
    String.prototype.encodeHex = function () {
        var bytes = [];
        for (var i = 0; i < this.length; ++i) {
            bytes.push(this.charCodeAt(i));
        }
    
        return bytes;
    };
   
    var byteArray = str.encodeHex();
    return byteArray;
};

I've tried some libs like crypto-js for react-native to create the MD5 hash, but could not generate the same value as C# ' 207154234292557519022585191701391052252168 '. 有人可以幫助我嗎?

應用 CryptoJS 並假設 UTF8 編碼,C# 邏輯可以實現如下:

 var result = ''; var hashBytes = CryptoJS.MD5('system123').toString(CryptoJS.enc.Latin1); for (var i = 0; i < hashBytes.length; i++) result += hashBytes.codePointAt(i).toString(); console.log(result); // 207154234292557519022585191701391052252168
 <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>

說明: CryptoJS.MD5()隱式執行 UTF-8 編碼,因為數據作為字符串傳遞(此處)。 Latin1 編碼器WordArray轉換為字節字符串。 在循環中,每個字節的 Unicode 代碼點值被確定為非負 integer,轉換為字符串,並連接起來。

問題在於,與 js 代碼相比,您在 C# 代碼中使用了不同的編碼。 嘗試在您的代碼中使用Encoding.UTF8而不是Encoding.Default

public static string GetMD5HashData(string data)
{
    //create new instance of md5
    MD5 md5 = MD5.Create();

    //convert the input text to array of bytes
    byte[] hashData = md5.ComputeHash(Encoding.UTF8.GetBytes(data));

    //create new instance of StringBuilder to save hashed data
    StringBuilder returnValue = new StringBuilder();

    //loop for each byte and add it to StringBuilder
    for (int i = 0; i < hashData.Length; i++)
    {
        returnValue.Append(hashData[i].ToString());
    }

    // return hexadecimal string
    return returnValue.ToString();

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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