我正在开发一个与人们的钱交互的信用卡项目,因此我需要存储密码。此密码不应包含任何字符,但不能包含数字[0-9],并且始终应为4位数字。
我不知道用于此密码的sql数据类型是什么。
以下是我想到的一些情况:
A. 如果我选择int
,我应该检查密码是否在1000到9999之间
B。如果我选择Char(4)
,那么我应该检查密码只是数字(而不是字符)
C。如果我选择十进制(4,0),那么我确定它低于10000但我还需要检查它是否大于999
您建议使用这样的密码和为什么?
答案 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的服务器,他们仍然至少要花一些时间来破解所有密码。理想情况下,他们模块还应报告速率正在查询它,并将成功查询的一小部分查询到另一个物理上独立的监视服务器。)
无论如何,如果您正在处理信用卡数据,您的数据库中可能还有其他字段也应该安全存储。一般来说,有相当详细的行业法规和/或法律管理所有这些 - 你已经检查了哪些适用于你和他们说什么?