Security 如何存储和验证从PIN/密码中随机选择的数字

Security 如何存储和验证从PIN/密码中随机选择的数字,security,authentication,encryption,hash,passwords,Security,Authentication,Encryption,Hash,Passwords,如果我有一个用户6位PIN(或n个字符字符串),并且我希望验证从PIN(或x个字符)中随机选择的3位数字,作为“登录”过程的一部分,我将如何将PIN存储在数据库或某个加密/哈希版本的PIN中,以便验证用户身份 想法: 将销存放在可反转的容器中 (对称或非对称)加密方式,用于数字检查的解密 存储针的一系列散列排列,这些排列与一些 ID,它链接到“随机 选定的数字,例如: ID:123=数字1、2、3的散列 ID:416=数字4、1、6的散列 问题: 密钥安全性:假设密钥是 “受保护”,并且该应

如果我有一个用户6位PIN(或n个字符字符串),并且我希望验证从PIN(或x个字符)中随机选择的3位数字,作为“登录”过程的一部分,我将如何将PIN存储在数据库或某个加密/哈希版本的PIN中,以便验证用户身份

想法:

  • 将销存放在可反转的容器中 (对称或非对称)加密方式,用于数字检查的解密
  • 存储针的一系列散列排列,这些排列与一些 ID,它链接到“随机 选定的数字,例如:
    • ID:123=数字1、2、3的散列
    • ID:416=数字4、1、6的散列
  • 问题:

  • 密钥安全性:假设密钥是 “受保护”,并且该应用程序不受保护 财务方面也不是很关键,但是 是“大容量”
  • 创建一个 大量散列 排列都是禁止的 高存储容量(16字节x若干字节) 排列)和耗时的可能过度消耗
  • 是否有其他选择、问题或改进

    是:我知道以可逆的方式存储密码/PIN是“有争议的”,理想情况下不应该这样做

    更新 请澄清: 1.随机数字是我正在考虑的一种方案,以避免密钥记录器。 2.尝试次数不可能超过有限的重试次数。
    3.其他元素有助于保护和验证访问。

    由于6C3是20,10C3是120,我将在六分之一的猜测中得到假阳性(被验证)


    无论您如何存储令牌,此方案只比根本不进行身份验证稍微好一点

    我完全同意msw的观点,但该观点仅(或大部分)适用于六位数方案。对于n-char方法,误报率(有时…)会低得多。一个改进是,随机字符的输入顺序必须与密码中的顺序相同

    此外,我认为存储散列排列将使使用某种蛮力方法查找密钥相对容易。例如,测试和组合三个字符的不同组合,并根据存储的哈希值检查这些组合。这将首先破坏散列密钥的目的,因此您最好存储加密的密钥


    另一个完全不同的观点是,您的用户可能会被这种奇怪的登录过程弄糊涂:)

    一个可能的解决方案是使用Reed Solomon(或类似的东西)构造n-of-m方案:生成一个n次多项式
    f(x)
    ,其中n是登录所需的位数,并通过在
    x=1..6
    处计算
    f(x)
    来生成pin码。合并后的数字将成为您的完整pin码。然后可以使用这些数字中的任意三个(连同它们的x坐标)来插值多项式常数。如果它们等于原始常数,则数字是正确的

    当然,最大的问题是用数字0..9组成一个字段,用于多项式常数运算。在这种情况下,普通的算术无法解决这个问题。我的有限域太生锈了,记不清是否可能。如果每位数为4位,可以使用
    GF(2^4)
    来克服这一缺陷。此外,无法选择您的PIN。它需要分配给您。最后,假设您可以解决所有问题,对于一个3ofn方案,只有1000个不同的多项式,而且对于适当的安全性来说,它太小了


    无论如何,我认为这不是一个好方法,但我想在混合中加入一些不同的想法。

    你说你有其他认证元素。如果您还拥有密码,则可以执行以下操作:

  • 询问密码(密码仅存储在您一侧的哈希值中)
  • 首先根据存储的密码哈希值检查输入密码的哈希值
  • 成功后,继续,否则返回1
  • 使用输入的(未加密的)密码作为对称加密PIN的密钥
  • 询问PIN码的一些随机数字
  • 通过这种方式,PIN被加密,但密钥不会以明文形式存储在您的一侧。我的银行的在线门户似乎正是这样做的(至少我希望PIN是加密的,但从用户的角度来看,登录过程与上述过程类似)。

    • 密钥是“受保护的”
    • 该应用程序既不财务也不高成本 关键的
    • 该应用程序是“高容量”
    • 创建大量散列 排列都是禁止的 高存储容量(16字节x若干字节) 排列)和耗时 可能有点过分了
    • 随机数字是我喜欢的一种方案 考虑避免关键记录者
    • 不可能尝试更多 比有限的重试次数还要多
    • 其他元素有助于确保 验证访问权限
    你似乎在为把PIN码存放在安全的地方而争论。我说去做吧。您基本上描述的是一种质询-响应身份验证方法,服务器端的明文存储在该用例中很常见

    与此类似的是一次性键盘或密钥矩阵。区别在于用户必须随身携带pad才能访问。好处是,只要您获得足够安全的密钥分发,就可以非常安全地避开键盘记录者

    如果您想使矩阵/焊盘的暴露不会单独造成危害,请让用户在焊盘上使用一个短(3-4号)插针,并保持灵敏的锁定机制

    矩阵示例:

      1  2  3  4  5  6  7  8
    A ;  k  j  l  k  a  s  g
    B f  q  3  n  0  8  u  0
    C 1  2  8  e  g  u  8  -
    
    挑战可能是:“输入PIN码,然后输入矩阵中B3方格中的字符。”

    答复可能是:
    98763

    因为您用于存储密码/密码短语的任何加密方案要么成本过高,要么很容易被破解,我倾向于将其简单地存储在纯文本中,并确保