UFO ET IT

.NET C #에 암호화 키를 저장하는 가장 좋은 방법

ufoet 2020. 11. 28. 13:18
반응형

.NET C #에 암호화 키를 저장하는 가장 좋은 방법


우리의 응용 프로그램에는 다시 암호화 된 xml 파일에 저장하고있는 민감한 구성 설정이 많이 있습니다.

이 보안 파일은 런타임에 해독되어야하며 구성 값을 읽어야합니다. 그러나 키와 초기화 벡터가 코드에 하드 코딩되어 있으므로 누구나 Reflector를 사용하여 읽을 수 있다는 문제가 발생합니다.

아무도 Reflector를 사용하여 읽을 수 없도록 .NET에 암호화 키를 저장하는 가장 좋은 방법은 무엇입니까?


다른 사용자로부터 데이터를 보호하려는 경우. ProtectedData 클래스를 살펴보십시오 .

(면책 조항 : 복사 방지 체계를 만들기 위해 데이터를 보호하는 것은이 답변에서 다루지 않습니다).

이 클래스는 Windows의 DPAPI를 사용하여 사용자 또는 컴퓨터 수준에서 데이터를 암호화하고 해독합니다.

ProtectedData / DPAPI를 사용하면 키를 처리하고 데이터를 직접 보호 할 필요가 없습니다. 그리고 현재 사용자의 데이터를 보호하도록 선택할 수 있습니다. 데이터는 동일한 도메인 사용자가 다른 컴퓨터에서 읽을 수 있습니다.

자신의 키를 만들려면. 사용자 / 컴퓨터별로 키를 만들고이 키를 레지스트리에 저장할 수 있습니다. 레지스트리를 보호 할 수 있기 때문에 현재 사용자 만 키를 다시 읽을 수 있습니다. 레지스트리에 업장이 있다는 것을 알고 있지만 실제로 이와 같은 데이터를 저장하는 데 매우 능숙합니다.

PS : 코드에 IV를 넣지 마십시오. 매번 새로운 IV를 만들어 데이터 앞에 놓습니다.


반사경에서 읽을 수없는 경우 프로그램에서 읽을 수있는 방법은 무엇입니까? 당신은 그것들을 쪼개서 모든 곳에 저장함으로써 그들을 난독화할 수 있지만, (AFAIK) 일단 당신의 프로그램이 그것들을 읽을 수 있도록 요구하면, 당신의 코드에 접근 할 수있는 모든 사람도 읽을 수 있습니다.

메모리의 값도 액세스 할 수 있다는 것을 잊지 마십시오 ( 기침 SecureString).


Machine Keystore를 사용해야합니다. 특히이 목적을위한 안전한 저장소입니다. 예를 들면 :

CspParameters cspParams = new CspParameters(PROV_RSA_FULL, null, KEYNAME);

cspParams.Flags = CspProviderFlags.UseMachineKeyStore;

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams);

여기서 KEYNAME은 나중에 키를 검색하는 데 사용할 수있는 사용자 지정 문자열입니다.

더 많은 예제는 다음 질문을 참조하십시오 . 머신 수준 RSA 키 컨테이너에 공개 키를 저장하는 방법


일반적으로 모든 세션에 대해 새 키와 IV를 만들어야하며 이후 세션에서 사용하기 위해 키와 IV를 저장하지 않아야합니다.

대칭 키와 IV를 원격 당사자에게 전달하려면 일반적으로 비대칭 암호화를 사용하여 대칭 키와 IV를 암호화합니다. 이러한 값을 암호화하지 않고 안전하지 않은 네트워크를 통해 전송하는 것은 이러한 값을 가로채는 사람은 누구나 데이터를 해독 할 수 있으므로 매우 안전하지 않습니다. 키와 IV를 암호화하고 전송하는이 프로세스에 대한 자세한 내용 은 암호화 체계 만들기를 참조하십시오 .


애플리케이션을 설치할 때 새 RSA 키 세트를 만든 다음 개인 키를 비밀번호로 사용하여 AES로 데이터를 암호화합니다. Windows는 RSA 개인 키를 생성 한 PC에 안전하게 저장 하므로 해당 컴퓨터에만 필요한 키가 있기 때문에 데이터 생성컴퓨터에서만 데이터를 해독 할 수 있습니다 .


파일 암호화 / 복호화 키를 원격 서버에 저장하고 https를 통해 애플리케이션으로 전송하는 웹 서비스를 통해 가져 오는 것은 어떻습니까? 이렇게하면 키가 컴퓨터의 메모리에 유지되지만 소스 코드 파일에는 저장되지 않습니다.

그래도 응용 프로그램을 실행하는 사람이 키 서버에 연결해야합니다.

참고 URL : https://stackoverflow.com/questions/4967325/best-way-to-store-encryption-keys-in-net-c-sharp

반응형