2017-10-28 6 views
1

AesCryptoServiceProviderAesCryptoServiceProvider.CreateEncryptor 예제 (https://msdn.microsoft.com/en-us/library/bb356459(v=vs.110).aspx)에 대한 MSDN 문서를 읽은 후 아래의 발췌문을 참조하십시오.AES 암호화 된 문자열에서 대소 문자를 구분하지 않는 조회를 수행해도 안전합니까?

static string EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV) 
{ 
    // Check arguments. 
    if (plainText == null || plainText.Length <= 0) 
     throw new ArgumentNullException("plainText"); 
    if (Key == null || Key.Length <= 0) 
     throw new ArgumentNullException("Key"); 
    if (IV == null || IV.Length <= 0) 
     throw new ArgumentNullException("IV"); 
    byte[] encrypted; 
    // Create an AesCryptoServiceProvider object 
    // with the specified key and IV. 
    using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider()) 
    { 
     aesAlg.Key = Key; 
     aesAlg.IV = IV; 

     // Create a decrytor to perform the stream transform. 
     ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); 

     // Create the streams used for encryption. 
     using (MemoryStream msEncrypt = new MemoryStream()) 
     { 
      using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
      { 
       using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) 
       { 

        //Write all data to the stream. 
        swEncrypt.Write(plainText); 
       } 
       encrypted = msEncrypt.ToArray(); 
      } 
     } 
    } 



    return Convert.ToBase64String(encrypted); 

} 

나는이 방법을 사용할 수 있어요 내가 SQL 데이터베이스에 암호화 된 문자열을 저장하기 시작했을 때 그러나 내가 어떤 검색은 대소 문자를 구분하지 될 것이라고 깨달았다 성공적으로 암호화 된 문자열을 생성. 내 질문은,이 방법을 사용하여 암호화 된 값에 대/소문자를 구분하지 않는 조회를 수행해도 괜찮습니까? 메서드가 동일한 문자열을 생성하지만 다른 경우에 어떤 기회를 얻을 수 있습니까?

또 다른 대안은 데이터베이스에서 값을 검색하고 메모리에서 대소 문자를 구분하는 검색을 수행하는 것입니다.하지만이를 피하려고합니다.

기술을 사용합니다. C#, EntityFramework, Azure SQL Server 2016, ASP.NET MVC, 웹 API

+0

현재 값은 바이트 []입니다.이 값은 문제가되지 않습니다. 문자열로 바뀌면 Base64와 hex라는 두 가지 선택이 가능합니다. 16 진수의 경우는 부적합합니다. Base64의 경우 중요하므로 무감각하게 일치시킬 수 없습니다. – bartonjs

+0

물론, 나는 'Convert.ToBase64String (암호화 된); return'을 수행하는 다른 코드를 추가하는 것을 잊어 버렸다. 16 진수로 변환하는 것이 좋습니다. 나는 다른 사람들이 SQL의 대소 문자를 어떻게 다루는 지 알고 싶어했다. – gorillapower

+0

16 진수 또는 base32 대신 base64로 저장합니다. :) – bartonjs

답변