私は最近 SecureString を発見しました。これは、基本的にアプリケーションの開始時に静的な秘密の文字列を初期化し、それを読み取り専用にして、アプリケーションの存続期間全体で使用したいという完璧なアプリケーションに適合しているようです (ハッシュ)。
SecureString クラスを使用する方法さえ理解できません。私が知る限り、SecureString を設定することはできますが、値を比較したり値を取得したりする方法はありません。
書き込み専用の場合、このクラスの目的は何ですか?
私は最近 SecureString を発見しました。これは、基本的にアプリケーションの開始時に静的な秘密の文字列を初期化し、それを読み取り専用にして、アプリケーションの存続期間全体で使用したいという完璧なアプリケーションに適合しているようです (ハッシュ)。
SecureString クラスを使用する方法さえ理解できません。私が知る限り、SecureString を設定することはできますが、値を比較したり値を取得したりする方法はありません。
書き込み専用の場合、このクラスの目的は何ですか?
いいえ、書き込み専用ではありません。Marshalクラスを使用して、String
から通常の .NET を取得できます。SecureString
IntPtr ptr = Marshal.SecureStringToBSTR(secureString);
string str = Marshal.PtrToStringBSTR(ptr);
Marshal.ZeroFreeBSTR(ptr);
return str;
Marshal.ZeroFreeBSTR
これによりアンマネージ メモリが割り当てられるため、リークを避けるために ( を使用して) 必ず解放する必要があることに注意してください。言うまでもなく、.NET 文字列に変換すると、SecureString の利点が失われます (文字列は、GC されるまでメモリに残り、ディスクにページングされる可能性があります)。
SecureString クラスの目的は、ユーザー データ (パスワードやクレジット カード番号など) のプライバシーを保護する必要がある API で使用できるようにすることです (たとえば、アプリケーションがクラッシュし、ミニダンプがディスクに保存される場合)。.NET Framework の一部のクラス ( PasswordBox.SecurePasswordなど) は、このデータの公開を避けるために SecureString オブジェクトを使用します。
ここでは両方の方法で、セキュア文字列に変換する方法とセキュア文字列から変換する方法があります。もちろん、セキュリティで保護された文字列に格納することの全体的なポイントは、そもそもメモリ内に存在しないようにすることです。
#region SecureString Manipulation
/// <summary>
/// Convert a Securestring to a regular string (not considered best practice, but make sure it's not in memory if you can help it)
/// </summary>
/// <param name="securePassword">Password stored in a secure string</param>
/// <returns>regular string of securestring password</returns>
public static string ConvertToUnsecureString(this System.Security.SecureString securePassword)
{
if (securePassword == null)
throw new ArgumentNullException("securePassword");
IntPtr unmanagedString = IntPtr.Zero;
try
{
unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(securePassword);
return Marshal.PtrToStringUni(unmanagedString);
}
finally
{
Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString);
}
}
/// <summary>
/// Pass a text password to this function to return a SecureString (doesn't store the password in memory)
/// </summary>
/// <param name="password">Text version of a password</param>
/// <returns>SecureString of a password (not readable by memory)</returns>
public static SecureString ConvertToSecureString(this string password)
{
if (password == null)
throw new ArgumentNullException("password");
var secure = new SecureString();
foreach (var c in password.ToCharArray())
secure.AppendChar(c);
return secure;
}
#endregion