代码之家  ›  专栏  ›  技术社区  ›  DCNYAM

信用卡号使用SecureString

  •  5
  • DCNYAM  · 技术社区  · 14 年前

    我一直在研究如何使用System.Security.SecureString类在处理信用卡号时将其保存在内存中。有没有人使用SecureString类来保存信用卡号码,或者大多数人只是使用普通的System.String类?

    4 回复  |  直到 14 年前
        1
  •  9
  •   Community M-A    7 年前

    PCI-DSS 从这个角度来看,不需要保护仅存储在内存中的卡号。

    PCI只规定卡号必须保存到磁盘,或通过网络传输必须加密。这是解决这个问题的常识。使用SecureString将确保字符串永远不会缓存到磁盘,但正如您所说的,使用起来很麻烦。不过,这篇文章有一些很好的建议: https://stackoverflow.com/questions/122784/hidden-net-base-class-library-classes#123141

        2
  •  2
  •   Community M-A    7 年前

    此前接受的2010年的答案当时可能是正确的,但请注意 PCI DSS 3.0

    培训开发人员安全编码技术,包括如何避免 常见的编码漏洞,以及了解数据的敏感性 在内存中处理。

    归根结底是要坚持行业最佳实践。

    考虑到近年来备受关注的漏洞,恶意软件、攻击者等通过抓取内存捕获敏感数据(包括信用卡信息),人们将更多的注意力放在保持敏感信息的安全上,即使是在内存中。

    尽可能使用SecureString。

    如果纯粹在winform应用程序中捕获信用卡号,那么在内存中保持卡号的安全是完全可行的。

    不过,用ASP.NET web应用程序,我不确定。。。我没试过,但是 general consensus 所以看起来不值得。另外, MSDN 特别提到ASP.NET应用程序,说:

    在ASP.NET中使用SecureString类不太合适 应用。您不太可能从网页中提取数据 它在SecureString中没有经过 中间系统。字符串对象

        3
  •  1
  •   Toby    14 年前

    我使用SecureString处理其他东西(不是信用卡),如果它要在内存中缓存很长时间的话。

    我经常遇到的问题是,您仍然必须将其封送到普通字符串中,以便实际将其用于任何用途,因此它的实用性非常有限。

    我已经创建了一些扩展方法来简化它们的使用:

        public static unsafe SecureString Secure(this string source)
        {
            if (source == null)
                return null;
            if (source.Length == 0)
                return new SecureString();
    
            fixed (char* pChars = source.ToCharArray())
            {
                SecureString secured = new SecureString(pChars, source.Length);
                return secured;
            }
        }
    
    
        public static string Unsecure(this SecureString source)
        {
            if (source == null)
                return null;
    
            IntPtr bstr = Marshal.SecureStringToBSTR(source);
            try
            {
                return Marshal.PtrToStringUni(bstr);
            }
            finally
            {
                Marshal.ZeroFreeBSTR(bstr);
            }
        }