I recently had the opportunity to look into and make use of the Microsoft System.Security.SecureString class. This class is one of those dark corners of the .NET Framework that you don’t think about on a day-to-day basis but are really glad that it’s there when your security auditor starts asking questions about how PII data such as social security numbers are protected while resident in memory. The SecureString class takes care of this problem, helping you avoid a situation where unencrypted sensitive String data is left lingering around on the .NET heap. However, since this class does reference unmanaged memory buffers, its use is not entirely intuitive. I’ve attempted to demystify things with the explanation, drawing and code snippets in this post.
I read through the SecureString class docs, as well as the article on DPAPI, and I can't find where it determines what encryption algorithm to use. I would hope that it's using AES, but as a developer I'm curious as to whether the encryption scheme can be chosen? This is important if requirements change and require a higher grade of encryption in the future, or if a vulnerability is found in the encryption mechanism that DPAPI is choosing.
Unfortunately, they've shot themselves in the foot on this feature if that's the case. I'm pretty sure that credit card companies require AES encryption, so this implementation could not be used in that case.