Pregunta

Estoy queriendo tratar de vincular la función de API de Windows CryptUnprotectData y la SecureString .net juntos la mejor manera posible. CryptUnprotectData devuelve una estructura DATA_BLOB que consiste en una matriz de bytes y una longitud de bytes. En mi programa esta será una cadena Unicode UTF-16. SecureString tiene un constructor que toma un char * params y longitud, así que me gustaría ser capaz de hacer algo como:

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

Esto funciona, excepto UTF-16 es de longitud variable, por lo que no se sabe muy bien lo que va a utilizar como argumento de longitud. El ejemplo anterior asume caracteres de 2 bytes (BMP), pero para otros planos que podría ser de hasta 4 bytes. Necesito saber el número de caracteres UTF-16 en la matriz de bytes. ¿Cuál es la mejor manera de hacer esto sin necesidad de copiar los valores en torno a la memoria (lo que compromete la seguridad). Mi plan es poniendo a cero y la liberación de la matriz de bytes lo más rápido posible.

¿Fue útil?

Solución

La mayoría de las ofertas de API de Windows con UTF-16 elementos de código por lo que yo soy consciente - en otras palabras, te trato pares suplentes como dos puntos de código en lugar de un solo carácter. Teniendo en cuenta que el constructor de SecureString está tratando con un puntero a .NET System.Char valores (que son UTF-16) Creo que el fragmento de código que tiene está muy bien - el número de elementos en pbData es mitad de su tamaño en bytes.

Por ejemplo, si pbData contenía (justo) un par suplente, cbData sería 4 y también querrá pasar en 2 como segundo argumento - porque eso es el número de valores que está SecureString la construcción de la <=> partir. El hecho de que es una proteína BMP no de caracteres Unicode es irrelevante para el número de UTF-16 <=> valores que ha representado en.

(Y sí, el soporte para datos no BMP es un poco de un desastre, y sospecho que muy pocas personas lo hacen bien en todas partes. Estoy seguro de que no. Afortunadamente en muchos lugares que no necesito que preocuparse ...)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top