【问题标题】:C# to node crypto hashing - md5 and sha256C# 到节点加密散列 - md5 和 sha256
【发布时间】:2020-03-31 13:26:07
【问题描述】:

这是我尝试移植到 Node 加密中的 C# 代码,但由于我不懂 c#,所以这有点棘手!

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# 复制:

https://repl.it/@HarryLincoln/NegligiblePoisedHexagon

节点工作原理:

  • crypto.createCipheriv() 绝对看起来像要走的路,但我不相信 c# 方法 (SHA256.Create() & MD5.Create()) 关心密钥的长度和 iv -但是crypto.createCipheriv() 可以。

  • c# 使用 CryptoStream:所以我认为某种 Buffer 是为了查看一些 similar C# -> Node crypto stuff

非常感谢您的帮助!

【问题讨论】:

  • SHA256MD5 不关心您要散列的数据的长度,但 AES 当然关心密钥和 iv 的长度。用户名的 SHA256 散列为 32 字节或 256 位。用户名的 MD5 散列为 16 个字节或 128 位。两者都是AES 支持的尺寸。因此,我对来自节点的crypto 了解不多,但我想如果您以相同的方式对用户名进行哈希处理以获取密钥和iv,您可以将它们提供给crypto.createCipheriv

标签: c# node.js aes md5 cryptojs


【解决方案1】:

.Net Framework - AES 加密默认使用 256 位密钥和 CBC 模式和 PKCS7 填充。

移植的代码很容易阅读,它就是这样做的:

return

BASE64 (
    AES_ENCRYPT (
        password,
        Key: SHA256(username),
        IV: MD5(username)
   )
)

同样可以在 Node 上轻松实现。

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    相关资源
    最近更新 更多