¿Cómo uso un SecureString para crear un SHA1 o SHA512 hash?
-
20-09-2019 - |
Pregunta
Me gustaría usar una varible SecureString dentro de VB.NET y convertir eso a un SHA1 o SHA512 hash. ¿Cómo iba a convertir de forma segura la SecureString a la matriz de bytes que HashAlgorithm.ComputeHash aceptará?
Solución
ha sido tecleada en c # y convertido a VB. Es de esperar que todavía funciona!
Dim input As [Char]() = "Super Secret String".ToCharArray()
Dim secret As New SecureString()
For idx As Integer = 0 To input.Length - 1
secret.AppendChar(input(idx))
Next
SecurePassword.MakeReadOnly()
Dim pBStr As IntPtr = Marshal.SecureStringToBSTR(secret)
Dim output As String = Marshal.PtrToStringBSTR(pBStr)
Marshal.FreeBSTR(pBStr)
Dim sha As SHA512 = New SHA512Managed()
Dim result As Byte() = sha.ComputeHash(Encoding.UTF8.GetBytes(output))
editar
Como se ha señalado por mí y algunos otros en los comentarios, quiero llevar esto a la atención aquí. Hacer esto no es una buena idea. Se están moviendo los bytes a un lugar que ya no es segura. Claro que puedes hacerlo, pero es probable que no debe
Otros consejos
¿Qué hay de que, si evitamos el único caso en cadena que se utiliza (salida) y sustituirla por una matriz de caracteres. Esto nos permitiría eliminar esta matriz después de su uso:
public static String SecureStringToMD5( SecureString password )
{
int passwordLength = password.Length;
char[] passwordChars = new char[passwordLength];
// Copy the password from SecureString to our char array
IntPtr passwortPointer = Marshal.SecureStringToBSTR( password );
Marshal.Copy( passwortPointer, passwordChars, 0, passwordLength );
Marshal.ZeroFreeBSTR( passwortPointer );
// Hash the char array
MD5 md5Hasher = MD5.Create();
byte[] hashedPasswordBytes = md5Hasher.ComputeHash( Encoding.Default.GetBytes( passwordChars ) );
// Wipe the character array from memory
for (int i = 0; i < passwordChars.Length; i++)
{
passwordChars[i] = '\0';
}
// Your implementation of representing the hash in a readable manner
String hashString = ConvertToHexString( hashedPasswordBytes );
// Return the result
return hashString;
}
¿Hay algo que perder?