【问题标题】:Best sql type for a Credit card password信用卡密码的最佳 sql 类型
【发布时间】:2013-01-05 11:19:36
【问题描述】:

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

我不知道该密码使用什么 sql 数据类型。

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

您对这样的密码有什么建议以及为什么

【问题讨论】:

  • 你会要求人们输入密码并存储吗? )
  • @NPE 这是一个真正的项目,所以我很关心它,我不是在玩。
  • @beherenow 是的,实际上人们可以更改密码。
  • @NPE 每个人都没有你那么有见识,你可以取笑别人,你可以帮助他们。如果您能帮助我获得一些经验并学到一些东西,我会很高兴。我想我们是来这里学习和教学的,不是吗?我正在学习。
  • 我认为您不必担心,因为我怀疑任何金融机构都会允许您按照您的提议行事。您在此处发帖的事实意味着您的团队非常不熟练,无法抵御当人们得知您正在存储 PIN 码时肯定会出现的黑客攻击

标签: sql passwords sqldatatypes


【解决方案1】:

您应该将密码存储为 Char(4)。如果您选择“int”,您将遇到一些诸如“0042”之类的密码问题,因为它会在没有零的情况下存储。 如果你选择 Char(4),你可以通过这个方法 Char.IsNumber(ch) 来验证 pin 码。

【讨论】:

  • 并非所有引脚都是 4 位数字。我的银行最多允许 8 个。
  • @Bohemian 你是对的,PIN 码并不总是相同的,但正如我在问题中提到的那样,它是 4 位数。
【解决方案2】:

通常,我会说您根本不应该存储密码,而应该存储它的hash。但是,只有 10,000 个可能的密码,并没有多大意义——如果您的数据库遭到入侵,再多的key stretching 也无法阻止攻击者暴力破解四位数密码。

但是,您可以做的至少是用以某种安全方式存储的密钥。理想情况下,您应该将密钥存储在无法从中提取密钥的 hardware security module 中,并让 HSM 负责加密和验证密码。

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

无论如何,如果您正在处理信用卡数据,那么您的数据库中可能还有其他字段也应该安全存储。一般来说,所有这些东西都有非常详细的行业法规和/或法律——您是否已经检查过其中哪些适用于您以及他们所说的内容?

【讨论】:

  • 实际上我们没有检查任何规则/法律,因为它是某种私人项目,它不是一个完整的银行系统,而是它的一部分。但是我检查了登录,如果发生 5 次登录失败,卡将被锁定在数据库中,用户应该来到代理机构进行身份验证。而且我喜欢加密和散列的建议,为什么我以前没有数过呢?
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
相关资源
最近更新 更多