2009-02-04 3 views
4

CryptUnprotectData windows API 함수와 .net SecureString을 가능한 한 가장 좋은 방법으로 연결하려고합니다. CryptUnprotectData는 바이트 배열과 바이트 길이로 구성된 DATA_BLOB 구조를 반환합니다. 내 프로그램에서는 유니 코드 UTF-16 문자열이됩니다. SecureString는 문자 *와 길이 PARAMS를 사용하는 생성자를 가지고, 그래서 나는 같은 것을 할 수 있도록하고 싶습니다 : UTF-16는 가변 길이를 제외하고,관리되지 않는 유니 코드 문자열에서 SecureString 만들기

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

이 작품을, 그래서 나는 정말 모른다 길이 인수로 사용할 값 위의 예는 2 바이트 문자 (BMP)를 가정하지만 다른 비행기의 경우 최대 4 바이트가 될 수 있습니다. 바이트 배열에서 UTF-16 문자 수를 알아야합니다. 메모리에서 값을 복사하지 않고 (따라서 보안을 손상시키는)이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 가능한 한 빨리 바이트 배열을 해제하고 해제 할 계획입니다.

답변

2

대부분의 Windows API는 내가 아는 한 UTF-16 코드 포인트를 처리합니다. 즉, 서로 게이트 쌍을 단일 문자 대신 두 코드 포인트로 처리합니다. SecureString에 대한 생성자가 .NET System.Char 값 (UTF-16)에 대한 포인터를 처리하고 있다고 가정하면 코드 스 니펫은 괜찮습니다. pbData의 요소 수는 이며 바이트 수는입니다. 예를 들어

pbData가 포함 된 경우 (단지) 대리 쌍 cbData 4 것입니다 그리고 당신은 여전히 ​​두 번째 인수로이 전달하고자하는 것 - 즉 System.Char 값이에서 SecureString을 구성하고 수가 있기 때문에. BMP가 아닌 하나의 유니 코드 문자라는 사실은 표현 된 UTF-16 System.Char 값의 수와는 관련이 없습니다.

(예, BMP가 아닌 데이터에 대한 지원은 엉망입니다. 다행히도 많은 곳에서 걱정할 필요가 없습니다 ...)

+0

고마워요, 존 완벽한 말이예요! 이 물건들은 모두 나에게 새롭다. – Jarrod