C#到节点加密哈希-md5和sha256
这是我试图移植到节点加密中的C代码,但由于我不懂C,这证明有点棘手C#到节点加密哈希-md5和sha256,c#,node.js,aes,md5,cryptojs,C#,Node.js,Aes,Md5,Cryptojs,这是我试图移植到节点加密中的C代码,但由于我不懂C,这证明有点棘手 public static string EncryptStringToBytes_Aes(string username, string password) { string encrypted = string.Empty; byte[] clearBytes = Encoding.UTF8.GetBytes(password); Console.WriteLine("1." +
public static string EncryptStringToBytes_Aes(string username, string password)
{
string encrypted = string.Empty;
byte[] clearBytes = Encoding.UTF8.GetBytes(password);
Console.WriteLine("1." + clearBytes);
using (Aes aesAlg = Aes.Create())
{
byte[] k; byte[] iv;
byte[] bytes = Encoding.UTF8.GetBytes(username);
k = SHA256.Create().ComputeHash(bytes);
iv = MD5.Create().ComputeHash(bytes);
aesAlg.Key = k;
aesAlg.IV = iv;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) {
csEncrypt.Write(clearBytes, 0, clearBytes.Length); }
encrypted = Convert.ToBase64String(msEncrypt.ToArray());
}
}
return encrypted;
}
C#回复:
节点工作方式:
看起来确实是个不错的选择,但是我不相信c#方法(SHA256.Create()&MD5.Create())会关心密钥和iv的长度,但是crypto.createCipheriv()
会crypto.createCipheriv()
- c#使用了加密流:因此我认为某种缓冲区是合适的
非常感谢您的帮助 .Net Framework-AES加密默认使用256位密钥、CBC模式和PKCS7填充 端口的代码非常易于阅读,它只执行以下操作:
return
BASE64 (
AES_ENCRYPT (
password,
Key: SHA256(username),
IV: MD5(username)
)
)
在节点上也可以轻松实现这一点
const crypto = require('crypto');
const key = crypto.createHash('sha256').update('username', 'utf8').digest();
const iv = crypto.createHash('md5').update('username', 'utf8').digest();
const encryptor = crypto.createCipheriv("aes-256-cbc", key, iv);
var crypted = Buffer.concat([encryptor.update('password', 'utf8'), encryptor.final()]);
let base64data = crypted.toString('base64');
console.log(base64data);
SHA256
和MD5
不关心散列数据的长度,但AES
当然关心密钥和iv的长度。用户名的SHA256散列长度为32字节或256位。用户名的MD5哈希值为16字节或128位。两者都是AES
支持的尺寸。因此,我对node中的crypto
了解不多,但我认为如果您以相同的方式对用户名进行哈希运算以获取密钥和iv,您可以将它们提供给crypto.createCipheriv