문제

CryptUnprotectData Windows API 함수와 .net SecureString을 가능한 최선의 방법으로 연결하려고 합니다.CryptUnprotectData는 바이트 배열과 바이트 길이로 구성된 DATA_BLOB 구조를 반환합니다.내 프로그램에서는 유니코드 UTF-16 문자열이 됩니다.SecureString에는 char* 및 길이 매개변수를 사용하는 생성자가 있으므로 다음과 같은 작업을 수행하고 싶습니다.

SecureString ss = SecureString((char*)textBlob.pbData, textBlob.cbData / 2);

UTF-16이 가변 길이라는 점을 제외하고는 작동하므로 길이 인수로 무엇을 사용해야할지 모르겠습니다.위의 예에서는 2바이트 문자(BMP)를 가정하지만 다른 평면의 경우 최대 4바이트일 수 있습니다.바이트 배열의 UTF-16 문자 수를 알아야 합니다.메모리 주변의 값을 복사하여 보안을 손상시키지 않고 이를 수행하는 가장 좋은 방법은 무엇입니까?가능한 한 빨리 바이트 배열을 제로화하고 해제할 계획입니다.

도움이 되었습니까?

해결책

내가 아는 한 대부분의 Windows API는 UTF-16 코드 포인트를 처리합니다. 즉, 서로게이트 쌍을 단일 문자가 아닌 두 개의 코드 포인트로 처리합니다.SecureString의 생성자가 .NET에 대한 포인터를 다루고 있다고 가정하면 System.Char 값(UTF-16) 당신이 가지고 있는 코드 조각은 괜찮다고 생각합니다 - pbData의 요소 수 ~이다 크기의 절반(바이트)입니다.

예를 들어 pbData (그냥) 대리 쌍을 포함하고, cbData 4가 될 것이고 여전히 두 번째 인수로 2를 전달하고 싶을 것입니다. System.Char 당신이 구성하고 있는 가치 SecureString 에서.BMP가 아닌 유니코드 문자라는 사실은 UTF-16의 수와 관련이 없습니다. System.Char 표현되는 값입니다.

(그렇습니다. BMP가 아닌 데이터에 대한 지원은 약간 혼란스럽습니다. 그리고 어디에서나 제대로 지원하는 사람은 거의 없을 것입니다.나는 그렇지 않다고 확신합니다.다행히도 많은 곳에서는 걱정할 필요가 없습니다...)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top