2017-11-30 1 views
0

나는 WPF PasswordBox에서 수집 한 중요한 정보를 취할 필요가 있습니다. 사용자가이 데이터를 입력 한 후에는 System.Security.Cryptography.Rijendael 암호화 기 개체를 사용하여 암호화해야합니다.Rijndael 암호화기를 사용하여 SecureString의 내용을 암호화하는 가장 좋은 방법은 무엇입니까?

는 현재 수정되고,이 코드는 "평문"문자열을 사용하고 다음 코드를 사용하고 암호화 :

using (var rijAlg = Rijndael.Create()) 
{ 
    var salt = ... //Generated Salt 
    rijAlg.KeySize = CryptographyHelper.ENCRYPTION_KEYSIZE; 
    rijAlg.Key = encryptionKey; //This is an encryption key safely derived elsewhere. 
    rijAlg.IV = salt; 

    var encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV); 
    using (var msEncrypt = new MemoryStream()) 
    { 
     using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
     { 
      using (var swEncrypt = new StreamWriter(csEncrypt)) 
      { 
       swEncrypt.Write(plainText); //Plain Text value. 
      } 
      encrypted = msEncrypt.ToArray(); 
     } 
    } 
} 

위에 값 plainText가 실제로 암호화 방법으로 전달되는 값이다. 메서드가 끝나면 encrypted 값은 Convert.ToBase64String(...)으로 전달되고 데이터는 Base64로 변환되어 암호화 메서드에서 반환됩니다.

내 질문에 위의 코드를 수정하여 암호화해야하는 값을 나타내는 SecureString 객체를 가져 와서 관련 값을 안전하게 암호화하고 관련 데이터를 정리하고 암호화 된 데이터를 문자열로 반환하면됩니다. 내가 plainText 값인 것처럼? 계속 메서드를 파생 시켜서 SecureString 개체를 반환 할 수 있으면 좋겠지 만, 그 문제는 다른 질문 일 수 있습니다.

+0

Rijndael 또는 SymmetricAlgorithm에서 파생 될 수 있고 서명에 오버로드하여 문자열을 Create에 전달할 수 있습니까? https://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael(v=vs.110).aspx – Programmer

+0

@Programmer 당신이 무엇을 의미하는지 잘 모르겠습니다. 특히 SecureString에서 오는 문자열 데이터를 전달하고 싶지 않습니다. SecureString 객체를 사용하는 목적의 일부는 .Net 문자열이 안전하지 않으므로 생성을 막는 것입니다. – RLH

+0

SecureString에 대한 자세한 내용을 읽었으니 걱정을 많이합니다. 스택이 마음에 들지 않으며 한 번에 한 문자 씩 소스가 필요하지 않은 곳입니다. https://msdn.microsoft.com/en-us/library/system.security.securestring(v=vs.110) .aspx. 이 문제를 어떻게 해결했는지 궁금합니다! – Programmer

답변

0

저는 오래전에 이것을했기 때문에 전체 코드를 가지고 있지 않습니다. SecureString을 해시 된 암호로 안전하게 변환하는 유일한 방법은 한 번에 한 문자 씩 읽어서 Stream을 사용하는 것입니다. 아마도 한 문자를 읽음으로써 메모리 덤프가 암호를 밝히지 않도록 할 수 있습니다.

한 문자 씩 읽기 구현의 예제는 this answer입니다. 내가 너라면, CryptoStreamWriteRead을 수행하는 맞춤형 Stream 클래스를 만들 것입니다. StreamDispose에서 관리되지 않는 포인터를 해제 할 수도 있습니다.

+0

'한 캐릭터를 읽으면 메모리 덤프가 암호를 밝히지 않을 것입니다.'글쎄, 당신은 그것을 드러내고 있습니다. 단지 짧은 시간 동안 찾기가 더 어려워 질뿐입니다. 전체 문자열이 동시에 메모리에있는 것은 아닙니다. 점점 더 실용적입니다. – Servy

+0

@Servy 음, 예, 조만간 해독해야합니다. –

+0

이것은 내가 필요한 것에 다가 가고 있습니다. 관리되지 않는 객체로 마샬링하고 바이트를 스트림으로 읽는 것만으로도 충분합니다. SecureString에서 데이터를 암호화하고 직렬화하는 방법이 이미 제공되었다고 가정 할 때 이것이 최선의 방법인지는 확실하지 않았습니다. – RLH

관련 문제