信用卡密码的最佳sql类型

时间:2013-01-05 11:19:37

标签: sql passwords sqldatatypes

我正在开发一个与人们的钱交互的信用卡项目,因此我需要存储密码。此密码不应包含任何字符,但不能包含数字[0-9],并且始终应为4位数字。

我不知道用于此密码的sql数据类型是什么。

以下是我想到的一些情况:
A. 如果我选择int,我应该检查密码是否在1000到9999之间
B。如果我选择Char(4),那么我应该检查密码只是数字(而不是字符)
C。如果我选择十进制(4,0),那么我确定它低于10000但我还需要检查它是否大于999

您建议使用这样的密码和为什么

2 个答案:

答案 0 :(得分:3)

您应将PIN码存储为Char(4)。如果你选择'int',你会遇到一些像'0042'这样的密码问题,因为它会存储没有零。 如果选择Char(4),则可以通过此方法Char.IsNumber(ch)验证PIN码。

答案 1 :(得分:2)

通常情况下,我会说你根本不应该存储密码,而应该存储hash密码。但是,只有10,000个可能的密码,没有太多意义 - 如果您的数据库受到威胁,任何数量的key stretching都不会阻止攻击者强制使用四位数密码。

但是,至少可以做的是加密密码(结合随机salt,这样两个相同的密码就不会映射到同一个密文)以一些安全的方式存储密钥。理想情况下,您应该将密钥存储在无法提取的hardware security module中,并让HSM负责加密和验证密码。

(HSM也不应该允许解密密码;唯一允许的查询应该是“使用随机盐加密此密码”和“检查此密码是否与此加密字符串匹配”。如果可能,模块还应具有功能一些内置的速率限制,因此即使攻击者设法接管连接到HSM的服务器,他们仍然至少要花一些时间来破解所有密码。理想情况下,他们模块还应报告速率正在查询它,并将成功查询的一小部分查询到另一个物理上独立的监视服务器。)

无论如何,如果您正在处理信用卡数据,您的数据库中可能还有其他字段也应该安全存储。一般来说,有相当详细的行业法规和/或法律管理所有这些 - 你已经检查了哪些适用于你和他们说什么?