2016-07-26 3 views
-1

는 I 2 개 방법 갖는 간단한 클래스있다 : I는 사용자가 "ABC"와 같은 단순한 문자열을 입력하고 I 필요한 곳 ​​프론트 엔드를 제공해야고정 염 생성 입력 된 문자열에 기초하여 - C#

private static byte[] PBKDF2(string field, byte[] salt, int iterations, int outputBytes) 

    { 
     Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(field, salt); 
     pbkdf2.IterationCount = iterations; 
     return pbkdf2.GetBytes(outputBytes); 
    } 

public static string CreateHash(string field, String salt) 
    { 
     //if (Array.TrueForAll(salt, x => x == 0)) 
     //{ 
     // RNGCryptoServiceProvider csprng = new RNGCryptoServiceProvider(); 
     // csprng.GetBytes(salt); 
     // string s = Convert.ToBase64String(salt); 
     //} 
     byte[] salts = Encoding.ASCII.GetBytes(salt); 
     byte[] hash = PBKDF2(field, salts, PBKDF2_ITERATIONS, HASH_BYTE_SIZE); 
     return Convert.ToBase64String(hash); 
    } 

을 그것에 기초하여 소금을 생성합니다. 이것은 데이터베이스에 저장하고 위의 메서드 (CreateHash)로 전달하여 데이터를 식별 해제하는 데 사용합니다. 이 salt/key는 프론트 엔드에 표시해야하는 암호를 다시 해독 할 수 있어야합니다.

다른 클래스/라이브러리도 사용할 수 있습니다. Rfc2898DeriveBytes 일 필요는 없습니다.

이 소금/키 생성 기능을 달성하는 방법에 대한 정보를 입력 해주십시오. 이 소금은 임의의 값일 수 없습니다.

감사합니다!

+4

소금은 사용자 입력에 기반하지 않고 무작위이어야합니다. 소금의 전체적인 점은 누군가가 동일한 입력을 두 번 입력하면 두 개의 다른 출력을 얻게된다는 것입니다. 'byte []'를 확인하기 위해 갈 때 소금을 알아야하기 때문에 이것을하고 있다면, 바이블 블롭의 앞이나 뒤쪽에 소금을 붙이거나 붙이면됩니다. 소금을 꺼내 PBKDF2 기능에 공급하는지 확인하십시오. –

+0

가능한 [솔루션] (https://social.msdn.microsoft.com/Forums/vstudio/en-US/d6a2836a-d587-4068-8630-94f4fb2a2aeb/encrypt-and-decrypt-a-string-in-c? forum = csharpgeneral)하지만 Rfc2898을 사용하고 있습니다 ... 왜 사용하지 않으시겠습니까? –

+0

@ ScottChamberlain 나는 소금이 역동적이라고 생각하지만 요구 사항은 여기 다릅니다. 이것은 암호 저장을위한 것이 아닙니다. 데이터를 식별 해제하고 파일에 저장해야합니다. 파일에 데이터가있을 때마다 다른 파일을 암호화하고 생성합니다. 모든 개인 정보는 공개되지 않습니다. 예를 들어 주어진 필드에 대해 David이라는 이름을 말하면 항상 이전에 생성 된 문자열과 동일한 문자열로 암호화되어야합니다. 나에 의해 정의되지 않는다! 소금을 고쳐서 Rfc2898DeriveBytes에 전달하면 동일한 입력에 대해 동일한 문자열을 얻을 수 있습니다. – vrkala

답변

0

해시 된 문자열의 암호를 해독해야한다고 언급했습니다.

PBKDF2는 암호화 알고리즘이 아니라 키 유도 함수이므로 소금이 있거나 없거나 결과 해시에서 원래 입력을 계산할 수 없습니다.

당신이 찾고 있어야하는 것은 해시가 아니라 암호화입니다.

일부 예로는 this link을 살펴보십시오.