Comment une utilisation d'un SecureString pour créer un SHA1 ou SHA512 Hash?
-
20-09-2019 - |
Question
Je voudrais utiliser un varible SecureString dans les VB.NET et le convertir en un hachage SHA1 ou SHA512. Comment puis-je convertir en toute sécurité le SecureString au tableau d'octets qui HashAlgorithm.ComputeHash acceptera?
La solution
a dactylographié en c # et converti en VB. Espérons que cela fonctionne encore!
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))
modifier :
Comme il a été souligné par moi-même et quelques autres dans les commentaires, je veux porter cette question à l'attention ici. Faire cela n'est pas une bonne idée. Vous déplacez les octets à un endroit qui n'est plus sûr. Bien sûr, vous pouvez le faire, mais vous ne devriez probablement pas
Autres conseils
Qu'en est-il que, si nous évitons le seul exemple utilisé String (sortie) et le remplacer par un tableau de caractères. Cela nous permettrait d'effacer ce tableau après utilisation:
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;
}
Y at-il quelque chose que je manqué?