For those who don't know what a SecureString is, it's secure, it's safe and it should be used to protect resources like passwords, secret keys, etc. After some digging, I found a way to reduce the SecureString attack surface as much as possible. Here's how to generate an RFC-2104 compliant signature (used by AWS services like S3) with a SecureString:
public static string Sign(string data, System.Security.SecureString key, KeyedHashAlgorithm algorithm) { // pointer to hold unmanaged reference to SecureString instance IntPtr bstr = IntPtr.Zero; char[] charArray = new char[key.Length]; try { // Marshal SecureString into byte array bstr = Marshal.SecureStringToBSTR(key); Marshal.Copy(bstr, charArray, 0, charArray.Length); algorithm.Key = Encoding.UTF8.GetBytes(charArray); return Convert.ToBase64String(algorithm.ComputeHash( Encoding.UTF8.GetBytes(data.ToCharArray())) ); } finally { // Make sure that the clear text data is zeroed out algorithm.Clear(); Array.Clear(charArray, 0, charArray.Length); Marshal.ZeroFreeBSTR(bstr); } }
No comments:
Post a Comment