C# SecureString 클래스를 이용한 문자열 보호
비밀번호를 일반 문자열에 담고 처리하다가 발생할 수 있는 보안 이슈에 대응하기 위해 SecureString을 사용함
아래와 같은 문제가 발생할 수 있음
문자열에 노출되지 않아야 할 정보를 담고 처리하지 말아야 한다.
메모리를 읽을 수 있으면 그대로 노출된다.
메모리에서 디스크로 교체되면 암호화 되지 않은 내용이 스왑 파일에 남음
가비지에 의해 제거되지 않고 남은 상황에서 응용프로그램이 비정상 종료될 경우 메모리 덤프에 민감 정보가 포함될 수 있음
//String -> SecureString
public static SecureString ConvertStringToSecureString(string str)
{
var secureStr = new SecureString();
if (str.Length > 0)
{
foreach (var c in str.ToCharArray()) secureStr.AppendChar(c);
}
return secureStr;
}
//SecureString->String
public static string ConvertSecureStringToString(SecureString sec_str)
{
IntPtr unmanagedString = IntPtr.Zero;
try
{
unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(sec_str);
return Marshal.PtrToStringUni(unmanagedString);
}
finally
{
Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString);
}
}
적절하게 사용하자.