2015-10-26 2 views
-5

Я работаю над веб-приложением ASP.NET MVC 5 в VS 2012, и я использую IIS 8 для развертывания веб-приложения.Подходит для шифрования строки внутри asp.net mvc

У меня есть токен безопасности, который я использую для вызова стороннего WebAPI. В настоящее время в моем классе контроллера, я определить и использовать маркер следующим образом:

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

Есть ли способ, чтобы зашифровать это значение, так что если кто-либо обращается код внутри VS или кто-либо реверс инженеры .dll файлов на IIS они не будут видеть фактическое значение токена, но вместо этого видят зашифрованное значение?

+0

Возможный дубликат [Как предотвратить управляемом DLL из реинжиниринга C#] (http://stackoverflow.com/questions/3490887/how-do-i-prevent-managed-dll-from-reverse-engineering-c-sharp) – Liam

+0

@ Liam, но даже если я предотвращу повторное проектирование .dll токен сохраняется и будет просматриваться изнутри VS .. поэтому захотите его зашифровать, поэтому он будет защищен всеми способами –

+1

Токен, который не должен уходить в код, вместо этого он должен быть частью конфигурации который живет в окружающей среды процесса. Соответствующая цитата: «Тест лакмусовой бумажки на то, что приложение имеет всю конфигурацию, правильно учтенную из кода, заключается в том, может ли кодовая база быть открыта с открытым исходным кодом в любой момент без ущерба для каких-либо учетных данных». (от http://12factor.net/config) –

ответ

1

Есть ли способ, чтобы зашифровать это значение, так что если кто-либо обращается код внутри VS или кто-либо реверс инженеры .dll файлов на IIS они не будут видеть фактическое значение маркеров, но вместо этого будет видеть зашифрованную стоимость?

Ну да, вы можете вставлять зашифрованное значение в коде, но проблема в том, что тот, кто декомпилирует библиотека будет также увидеть как расшифровать его.

Поскольку вы говорите об ASP.NET, ваш web.config так же уязвим, как и исходный код, поэтому там нет дополнительной безопасности.

Решение должно либо хранить значение где-то в безопасности вне вашего веб-приложения (защищенная база данных?), Либо использовать значение external как часть процесса дешифрования, например, сертификат или другое значение секретного ключа.

+0

Если у вас есть dll, это не является хорошим предположением, что у вас также есть файлы конфигурации, если вы декомпилируете DLL с конфигурационными файлами, тогда вы можете посмотреть, как работает шифрование, ключи и зашифрованное значение, все, и вы можете все еще доступ к значению? – Liam

+0

@ Liam Да, поэтому вам нужно значение (или некоторый ключ для его расшифровки) вне веб-приложения (код и конфиг). –

1

Следующий класс имеет шифрования и дешифрования процесс, с помощью которого можно зашифровать или расшифровать свои данные с предоставлением некоторых значений, т.е.

Ключ = строка/байт [], чтобы зашифровать или расшифровать вход

Input = требуемое поле пользователя, на котором он хочет применить криптография

Пожалуйста, напишите этот класс следующим образом:

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