将信用卡信息存储到数据库的最佳实践

77

在我的国家,网上支付并不是一件老事情。去年我第一次看到一个网站应用程序直接将付款打入本地银行账户。

所以,我是一个编写网站支付系统的新手。

我的问题是,将信用卡信息存储到数据库中的最佳实践是什么...

我有很多想法:加密信用卡、数据库安全限制等。

你们做了什么?


29
作为许多此类系统的用户,我只是想说谢谢你询问。 - reuscam
1
在2020年,如果可以的话,尽量使用Stripe。 - Alan
7个回答

112

不要这么做

这样做存在的风险太大了,通常你需要接受外部审核,以确保你遵守所有相关的本地法律和安全实践。

有许多第三方公司可以为你提供服务,他们已经费尽心思确保他们的系统是安全的,他们遵守当地法律等等。我过去使用过的一个美国的例子是authorize.net。一些银行也有你可以连接到存储信用卡数据并处理支付的系统。

我知道你所在的国家可能没有像美国那么严格的法律,但在我看来,这并不是自己开发这种系统的借口。当你处理别人的钱时,风险太大而不值得冒险。


2
我甚至认为保存信用卡号码是非法的(荷兰)。因此,我们在xml交易日志中使用************混淆了这些数字。 - Bob Fanger
这种方法的问题在于许多网站将我的国家限制为信用卡所在国家...我正在深入研究这个情况,如果您有建议,我会告诉您是否可以做到。 - Garis M Suero
1
@Garis:是的,我明白这可能会因国家而异。我建议尝试向一些大型银行打听,因为其中一些银行也提供此类事情的API。 - Dean Harding
@Raju:通常需要保留原始数字以进行后续的作废、取消和退款。最终,允许的期限将到期,然后删除将是一个不错的选择。 - joe snyder
1
@joesnyder:不需要,而且根据我在处理信用卡交易方面的12年经验,从来没有必要。只需知道交易ID即可处理所有信息。这也是您应该存储的唯一信息。 - NotMe
@Chris:我们公司内部系统自1995年以来一直使用MAPP协议,它确实需要这个数字。 - joe snyder

51

在2020年,建议使用Stripe来处理支付信息,避免自行存储支付信息。

历史回答:

针对这个问题,我建议采用全面、分层的方法。

首先,应该提供存储信用卡信息的选项。

其次,数据应该采用强加密方式进行存储。建议使用256位AES加密算法。在选择密钥时,请确保使用整个密钥空间(仅使用生成的随机字母数字符号字符串作为密钥是新手错误)。

第三点,需要妥善保管AES密钥,请勿将其直接嵌入到代码中。如果您正在使用Windows,请考虑使用DPAPI。

第四点,您需要设置数据库权限,以便应用程序和计算机能够按需访问信用卡数据。

第五点,需要安全地保护连接字符串到您的数据库。

第六点,确保任何将访问信用卡数据的应用程序都会正确保护它。


1
AES没有512位的密钥长度。(也许Rijndael有,但不是AES实现)。 - PaulG
1
你是正确的。标准只规定了最大256位的密钥大小。然而,密钥大小没有实际限制。 - Alan
你知道在Unix系统上存储密钥的好地方吗?由于加密只能像密钥本身周围的安全性一样好,我很担心如何保护它。 - Jason
-1并没有说明政府规定存储信息的情况,+1则表示采用了良好的技术方式。 - Sumit Gupta
3
@Sumit gupta 没有人能告诉你所有国家的法律,毕竟SO不是律师的问答平台。 - Ravinder Payal

27

2
捂脸,我太蠢了,没有立刻想到这个。你一定要看看PA DSS和PCI标准。 - dplass

2

加密,加密,再加密。除非必须要解密,否则不要解密以显示最后四位数字或告知用户他们的卡号是什么。

事实上,如果可能的话,甚至不要将加密后的卡号存储在与其他用户信息相同的物理服务器上。


谢谢,我也在考虑每次已登录的用户要支付任何产品时都要求输入CVV2(背面三位数码)。 - Garis M Suero
@Garis 使用这段代码的另一个好处是,一些支付网关会在您使用它时减少交易费用。至少我们所使用的银行在切换到要求安全码后的交易成本较低。 - Waleed Al-Balooshi
2
@Garis Suero,CVV2代码不允许被存储。当您获取CVV2(以及邮政编码和其他信息)时,您的费率将更低。通常情况下,您可能会根据是否为奖励卡等因素而收取几种不同的费率。 - Cade Roux
我明白了,我肯定不会存储 CVV2 代码,每次用户购买产品时都会要求输入...另一方面,我认为我们国家还没有这种法律,我将进一步调查,并在几周内告诉您... - Garis M Suero

1

由于存储信用卡信息存在风险,您和客户都应避免这样做。


1

-2

我建议您使用类似AES的强加密算法和长的秘钥来加密卡号。

然后,将您的秘钥保存在安全的地方,例如外部硬盘或光盘。需要使用秘钥时,请使用外部硬盘。

如果您正在使用共享主机,则必须将秘钥存储在外部设备中。

严格控制您的数据库

  1. 为您的数据库定义严格的用户
  2. 如果不需要,删除数据库的root用户。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接