我在C#中有一个系统,它接收一个密码,并使用此函数将该密码加密为MD5哈希。我读了很多帖子和建议,但我无法像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();
}
此函数的返回值是此字符串207154234292557519022585191701391052252168。我需要在React Native中生成相同的字符串。这部分Encoding.Default.GetBytes(data(在C#函数中,我在React native中复制了,所以C#和React native都从输入字符串返回相同的字节数组。
输入字符串:'system123'字节数组:'[11512115116101109',49,50,51]'
React本机函数生成字节数组。
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;
};
我尝试过一些库,比如crypto-js for react native来创建MD5哈希,但无法生成与C#">2071542392557519022585151701391052252168"相同的值。有人能帮我吗?
应用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代码点值被确定为非负整数,转换为字符串并连接。
问题是,与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();
}