190 votes

Comment convertir SecureString en System.String?

Toutes les réservations sur unsecuring votre SecureString par la création d'un Système.Chaîne de ce côté, comment peut-il être fait?

Comment puis-je convertir un Système ordinaire.De sécurité.SecureString du Système.Chaîne?

Je suis sûr que beaucoup d'entre vous qui sont familiers avec SecureString vont répondre qu'il ne faut pas transformer un SecureString ordinaire .NET en chaîne, car il supprime toutes les protections de sécurité. Je sais. Mais pour l'instant mon programme le fait tout avec chaînes ordinaires de toute façon, et je vais essayer d'améliorer sa sécurité et même si je vais être en utilisant une API qui renvoie un SecureString pour moi, je suis pas d'essayer de l'utiliser pour augmenter la sécurité de mes données.

Je suis conscient du Maréchal.SecureStringToBSTR, mais je ne sais pas comment prendre cette BSTR et de faire un Système.Chaîne de caractères.

Pour ceux qui demande à savoir pourquoi je n'aurais jamais envie de le faire, eh bien, je vais prendre un mot de passe d'un utilisateur et en le présentant comme un formulaire html POST pour connecter l'utilisateur à un site web. Alors... c'est vraiment à faire avec la gestion, en clair tampons. Si je pouvais encore avoir accès à la non géré, en clair de la mémoire tampon, j'imagine que je pouvais faire octet-par-octet stream écriture sur le flux réseau et de l'espoir que ce qui maintient le mot de passe de sécuriser l'ensemble de la voie. Je suis en espérant une réponse à au moins l'un de ces scénarios.

Merci!

219voto

Rasmus Faber Points 24195

Utilisez la classe Marshal à partir de l'API interopservices:

 String SecureStringToString(SecureString value){
  IntPtr valuePtr = IntPtr.Zero;
  try{
    valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
    return Marshal.PtrToStringUni(valuePtr);
  }
  finally{
    Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
  }
}
 

Si vous souhaitez éviter de créer un objet de chaîne géré, vous pouvez accéder aux données brutes à l'aide de Marshal.ReadByte(IntPtr, Int32) :

 void HandleSecureString(SecureString value){
  IntPtr valuePtr = IntPtr.Zero;
  try{
    valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
    for(int i=0;i<value.Length;i++){
      short unicodeChar = Marshal.ReadInt16(valuePtr, i*2);
      // handle unicodeChar
    }
  }
  finally{
    Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
  }
}
 

53voto

Andrew Arnott Points 35346

Dang. juste après cette annonce j’ai trouvé la réponse dans cet article. Mais si quelqu'un sait comment accéder à la valeur IntPtr non managée, tampon non chiffré qui expose de cette méthode, un octet à la fois afin que je ne dois pas créer un objet string managé hors de lui pour garder ma sécurité élevée, s’il vous plaît ajouter une réponse. :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X