Security 如何存储和验证从PIN/密码中随机选择的数字
如果我有一个用户6位PIN(或n个字符字符串),并且我希望验证从PIN(或x个字符)中随机选择的3位数字,作为“登录”过程的一部分,我将如何将PIN存储在数据库或某个加密/哈希版本的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的散列 问题: 密钥安全性:假设密钥是 “受保护”,并且该应
- ID:123=数字1、2、3的散列
- ID:416=数字4、1、6的散列
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个不同的多项式,而且对于适当的安全性来说,它太小了
无论如何,我认为这不是一个好方法,但我想在混合中加入一些不同的想法。你说你有其他认证元素。如果您还拥有密码,则可以执行以下操作:
- 密钥是“受保护的”
- 该应用程序既不财务也不高成本 关键的
- 该应用程序是“高容量”
- 创建大量散列 排列都是禁止的 高存储容量(16字节x若干字节) 排列)和耗时 可能有点过分了
- 随机数字是我喜欢的一种方案 考虑避免关键记录者
- 不可能尝试更多 比有限的重试次数还要多
- 其他元素有助于确保 验证访问权限
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因为您用于存储密码/密码短语的任何加密方案要么成本过高,要么很容易被破解,我倾向于将其简单地存储在纯文本中,并确保