【问题标题】:Encryption Method using md5 hash and triple Des encryption in angular 7在 Angular 7 中使用 md5 哈希和三重 Des 加密的加密方法
【发布时间】:2019-10-09 12:00:35
【问题描述】:

我想用angular7实现同样的加密,

以下函数是用 C# 编写的,我尝试了 crypto-js,但它没有给我相同的结果。

使用 System.Security.Cryptography;

    public static string Encrypt(string PlainText, string SecretKey)
    {
        try
        {
            byte[] keyArray;
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(PlainText);

            var hashMD5 = new MD5CryptoServiceProvider();
            keyArray = hashMD5.ComputeHash(UTF8Encoding.UTF8.GetBytes(SecretKey));
            hashMD5.Clear();

            var triDESProv = new TripleDESCryptoServiceProvider();
            triDESProv.Key = keyArray;
            triDESProv.Mode = CipherMode.ECB;
            triDESProv.Padding = PaddingMode.PKCS7;

            var cTransform = triDESProv.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            triDESProv.Clear();
            string encText = Convert.ToBase64String(resultArray, 0, resultArray.Length);
            return encText;
        }
        catch
        {
            return "ERROR";
        }
    }

【问题讨论】:

  • 你是如何配置和使用crypto-js的?另外,为什么要使用 MD5 和 3DES?两者都被认为是不安全的。
  • 你为什么要在客户端做这些事情?这是为了什么?在客户端这样做的问题是您将密钥暴露给您的客户端,这使得它对于阻止客户端的事情不是很有用。
  • tried crypto-js but its not giving me the same results也许你也可以分享JS代码,我们无法读取你的显示器。接下来 - 您使用的不是真正安全的参数 - 用于密钥拉伸的 MD5、带有部分密钥的 3DES、ECB 模式。认真考虑使用默认 TLS (https) 是否不能更好地满足您的要求
  • "SecretKey" 如果你在基于浏览器的 JS 代码中实现它,它将不再是一个秘密。这里的实际用例是什么?通常只使用 HTTPS 加密您的 连接 应该足以保护传输中的数据。

标签: javascript c# encryption angular7 md5


【解决方案1】:

为什么不直接在 C# 中安装 libsodium-net,在 JavaScript 中安装 sodium-plus,然后使用 crypto_secretbox(),而不是您实现的算法?

Libsodium 的 secretbox 比您上面发布的代码更安全,原因如下:

在各个方面,secretbox 都更加安全。对 libsodium 的支持也是 near-ubiquitous

【讨论】:

    【解决方案2】:

    我不是这方面的专家,但我能够解决它

    .NET - C#

    private static readonly string key = "password";
        public static string Encriptar(string texto)
        {            
            byte[] keyArray;
            byte[] Arreglo_a_Cifrar = Encoding.UTF8.GetBytes(texto);
            byte[] ivArray = new byte[8];
            //Algoritmo MD5
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            //se guarda la llave para que se le realice hashing
            keyArray = hashmd5.ComputeHash(Encoding.UTF8.GetBytes(key));
            hashmd5.Clear();
    
            Array.Copy(keyArray, 0, ivArray, 0, 8);
    
            //Algoritmo 3DES
            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider
            {
                Key = keyArray,
                Mode = CipherMode.ECB,
                Padding = PaddingMode.PKCS7,
                IV = ivArray
            };
            //se empieza con la transformación de la cadena
            ICryptoTransform cTransform = tdes.CreateEncryptor();
            byte[] ArrayResultado = cTransform.TransformFinalBlock(Arreglo_a_Cifrar,0, Arreglo_a_Cifrar.Length);
            tdes.Clear();
            return Convert.ToBase64String(ArrayResultado, 0, ArrayResultado.Length);
        }
    

    Angular - CryptoJS

    encriptarDatos(valor: string) {
    
     var key = CryptoJS.MD5(CryptoJS.enc.Utf8.parse(environment.keyHash));
     var iv = {...key};
     iv.sigBytes = 8;
     var mode = CryptoJS.mode.ECB;
     var encrypted = CryptoJS.TripleDES.encrypt(valor, key, { iv, mode }).toString();
     console.log('DATO ENC:'+encrypted);
    
     return encrypted;
    }
    

    IV(初始化向量)必须是键的一部分并且在两个框架中必须是相同的大小(Net - Angular)

    我的密码长度为 10 个字符,我没有测试其他大小

    帮助链接:

    CryptoJS-encryptUsingTripleDES

    Using UTF-8 encoding

    Net TripleDES

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-29
      • 2011-10-22
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多