본문 바로가기
프로그래밍/C#

C# SecureString 클래스를 이용한 문자열 보호

by zoo10 2018. 2. 27.

비밀번호를 일반 문자열에 담고 처리하다가 발생할 수 있는 보안 이슈에 대응하기 위해 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);

    }

}


적절하게 사용하자.