2009-10-07 2 views

Répondre

-2

A tapé en C# et converti en VB. J'espère que cela fonctionne toujours!

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 ceci n'est pas une bonne idée. Vous déplacez les octets vers un endroit qui n'est plus sécurisé. Bien sûr, vous pouvez le faire, mais vous ne devriez probablement pas

+0

Pourquoi l'avez-vous converti? L'avez-vous en C#? – backslash17

+0

Je l'ai converti parce que Luke l'a demandé sur VB.net. Si vous en avez besoin dans C# essayez de le faire tourner à travers ce convertisseur http://www.developerfusion.com/tools/convert/vb-to-csharp/ – Joe

+0

Merci Joe! – Luke

0

Et à propos de ça, si nous évitons la seule occurrence de String utilisée (sortie) et la remplaçons 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 j'ai raté?

+1

Oui - voir la réponse à cette question: http://stackoverflow.com/questions/14293344/hashing-a-securestring-in-net – RobSiklos

Questions connexes