在SQL数据库中存储加密的信用卡号

时间:2013-08-05 18:41:50

标签: c# .net sql encryption credit-card

我想知道在 C#(。net framework)的SQL数据库中存储加密信用卡号的最佳方法是什么。我应该使用某种String/SecureString/Byte Array的{​​{1}}手动执行此操作吗?

我听说有一个替代方案(可能更简单的选项),服务提供商(您将交易置于其中)将为您提供可用于检索的symmetric encryption交易信息。我不知道如何采用这种方法,但这是更好的选择吗?我想要最安全,最安全的选择。我也希望 PCI兼容

2 个答案:

答案 0 :(得分:4)

如果要将信用卡号存储在您控制的数据库中,请阅读PCI DSS:

http://en.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard

你为什么要遵守:

https://www.pcisecuritystandards.org/security_standards/why_comply.php

然后阅读如何说服那些要求你在家里存放信用卡的人,这是你带来的伤害世界:

https://security.stackexchange.com/questions/18677/how-to-convince-coworkers-to-not-store-credit-card-numbers-ourselves

答案 1 :(得分:3)

更新:在我写这篇答案后的三年里,我学到了更多关于PCI的知识,并且发布了更新的规范。虽然以下信息不是错误,但步骤1会将您PCI scope置于"D for Merchants"级别,这是最繁重的级别。

处理此问题的更好方法是不要自己触摸卡数据。您使用处理器提供的表单向他们发送数据,或者您只是重定向到他们(如PayPal)。这两个选项都可以使您达到"A""A-EP"级别,这样更容易进行认证。

无论哪种方式,您仍然会收到一个可以安全存储的令牌,因此步骤3和4仍然适用。


原始答案:

  

我听说过另一种选择(也许是更容易的选择),服务提供商(您将交易置于其中)将为您提供一个可用于检索交易信息的密钥。

这是事实。基本上,这个过程是:

  1. 从客户/用户处获取信用卡信息。存储在代码内变量中(即不是文件,日志或数据库)。
  2. 将信用卡信息发送到您的处理器(例如Authorize.NET,Payware,Paypal等)。
  3. 收到包含某种“令牌”的回复。这是您识别此特定事务以便将来与处理器通信的方式。
  4. 令牌存储到您的数据库中。加密会很好,但不是必需的,因为令牌只是引用“Transaction#12345”,并且本身没有敏感信息。