【问题标题】:Approaches to encrypt a string inside asp.net mvc在 asp.net mvc 中加密字符串的方法
【发布时间】:2015-10-26 15:01:02
【问题描述】:

我正在 VS 2012 中开发一个 ASP.NET MVC 5 Web 应用程序,我正在使用 IIS 8 来部署 Web 应用程序。

我有一个用于调用第三方 WebAPI 的安全令牌。目前在我的控制器类中,我定义和使用令牌如下:

string token = "D12356"; 
string url = currentURL + "resources?AUTHTOKEN=" + token;

有没有办法加密这个值,所以如果有人访问 VS 中的代码或任何人对 IIS 上的 .dll 文件进行反向工程,他们将看不到实际的令牌值,而是看到加密的值?

【问题讨论】:

  • @Liam 但即使我阻止对 .dll 进行逆向工程,令牌也会被保存并将从 VS 内部查看 .. 所以想要对其进行加密,所以它在所有方面都是安全的
  • 这样的标记不应该留在代码中,而应该是进程环境中配置的一部分。相关引用:“一个应用程序是否将所有配置正确地从代码中提取出来的试金石是,代码库是否可以随时开源,而不会损害任何凭据。” (来自12factor.net/config
  • 好的,我可以将它移动到 web.config 中,这就是我以前的做法,,所以我可以按照哪种方法将它加密到 web.config 中?
  • 你在这里尝试实现什么?您想防止逆向工程或有人获取您的源文件吗?通常,您的源代码(如果敏感)将在您的网络中得到保护,因此这不是问题。一旦编译源代码就会变成 dll,因此获取源代码的唯一方法是对它们进行逆向工程。如果你混淆你的代码,你会使这个逆向工程变得更加困难(尽管并非不可能)。如果令牌在 url 中传递,那么任何代理都可以看到它。这整个问题非常混乱和令人困惑。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 encryption


【解决方案1】:

有没有办法加密这个值,所以如果有人访问 VS 中的代码或任何人对 IIS 上的 .dll 文件进行反向工程,他们将看不到实际的令牌值,而是看到加密的值?

嗯,是的,你可以在代码中嵌入一个加密的值,但问题是,反编译库的人也会看到你是如何解密它的

由于您谈论的是 ASP.NET,因此您的 web.config 与您的源代码一样易受攻击,因此没有增加安全性。

解决方案是将值存储在 Web 应用程序之外的安全位置(安全数据库?),或者使用一些外部值作为解密过程的一部分,例如证书或其他私钥价值。

【讨论】:

  • 如果你有 dll 是不是一个很好的假设你也有配置文件,如果你用配置文件反编译 dll 那么你可以查看加密是如何工作的,密钥和加密的值,一切,您仍然可以访问该值吗?
  • @Liam 是的,这就是为什么您需要 Web 应用程序(代码和配置)之外的值(或解密它的一些密钥)。
【解决方案2】:

以下类具有加密和解密过程,通过该过程可以通过提供一些值来加密或解密其数据,即

Key = string / byte[] 加密或解密输入

输入 = 他想要应用加密的用户必填字段

请把这个类写成如下:

namespace SomeNameSpace
{
public enum CryptType { ENCRYPT, DECRYPT }
public enum CryptTechnique { AES, RC2, RIJ, DES, TDES }
public class Cryptography
{
    public object Crypt(CryptType EncryptOrDecrypt, CryptTechnique CryptographicTechnique, object Input, string Key)
    {
        try
        {
            SymmetricAlgorithm SymAlgo; //This class is parent of all classes in CryptTechnique enums
            switch (CryptographicTechnique)
            {
                case CryptTechnique.AES:
                    SymAlgo = new AesManaged();
                    break;
                case CryptTechnique.RC2:
                    SymAlgo = new RC2CryptoServiceProvider();
                    break;
                case CryptTechnique.RIJ:
                    SymAlgo = new RijndaelManaged();
                    break;
                case CryptTechnique.DES:
                    SymAlgo = new DESCryptoServiceProvider();
                    break;
                case CryptTechnique.TDES:
                    SymAlgo = new TripleDESCryptoServiceProvider();
                    break;
                default:
                    return false;
            }

            SymAlgo.Key = UTF8Encoding.UTF8.GetBytes(Key);
            SymAlgo.Padding = PaddingMode.PKCS7;
            SymAlgo.Mode = CipherMode.ECB;

            ICryptoTransform ICT = null;
            byte[] resultArray;

            if(EncryptOrDecrypt == CryptType.ENCRYPT)
            {
                ICT = SymAlgo.CreateEncryptor();
            }
            else if(EncryptOrDecrypt == CryptType.DECRYPT)
            {
                ICT = SymAlgo.CreateDecryptor();
            }

            if (Input is string)
            {
                byte[] inputArray = UTF8Encoding.UTF8.GetBytes(Input as string);
                resultArray = ICT.TransformFinalBlock(inputArray, 0, inputArray.Length);
                SymAlgo.Clear();
                return Convert.ToBase64String(resultArray, 0, resultArray.Length);
            }
            else if (Input is byte[])
            {
                resultArray = ICT.TransformFinalBlock(Input as byte[], 0, (Input as byte[]).Length);
                SymAlgo.Clear();
                return resultArray;
            }
            return false;
        }catch(Exception ex)
        {
            return ex.Message;
        }
    }
}
}

在您想要加密或解密数据的某些控制器中,将其写为

public ActionResult SomeAction()
    {
                string Key = "1234567890abcdef"; //key must have 16 chars, other wise you may get error "key size in not valid".
                Password = "Secret";
                Cryptography Crypt = new Cryptography();
                EncryptedPassword = (string)Crypt.Crypt(CryptType.ENCRYPT, CryptTechnique.RIJ, Password, Key);
    }

在这里您将在 EncryptedPassword 变量中获得加密密码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2017-02-28
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多