Security 引脚生成
我期待着开发一个系统,我需要分配给每个用户一个唯一的pin码的安全。用户将只输入此pin码作为识别自己的一种方式。因此,我不希望用户能够猜到其他用户的pincode。假设我的最大用户数是100000,那么这个pin码应该有多长 e、 g.1234 4532 3423 我应该通过某种算法生成这个代码吗?或者我应该随机生成它 基本上,我不希望人们能够猜测其他人的pincode,它应该支持足够数量的用户 如果我的问题听起来有点混乱,我很抱歉,但我很乐意澄清任何疑问 多谢各位 更新 在阅读了下面所有的帖子之后,我想补充一些细节Security 引脚生成,security,encryption,random,cryptography,Security,Encryption,Random,Cryptography,我期待着开发一个系统,我需要分配给每个用户一个唯一的pin码的安全。用户将只输入此pin码作为识别自己的一种方式。因此,我不希望用户能够猜到其他用户的pincode。假设我的最大用户数是100000,那么这个pin码应该有多长 e、 g.1234 4532 3423 我应该通过某种算法生成这个代码吗?或者我应该随机生成它 基本上,我不希望人们能够猜测其他人的pincode,它应该支持足够数量的用户 如果我的问题听起来有点混乱,我很抱歉,但我很乐意澄清任何疑问 多谢各位 更新 在阅读了下面所有的帖
再次感谢大家的精彩回复。4个随机数字应该足够了,如果您将其附加到唯一的已知用户ID(可能仍然是数字)[根据starblue的建议] 伪随机数生成器也应该可以。您可以使用可逆加密(AES)或单向散列将它们存储在数据库中 您主要关心的是,在被锁定之前,一个人可能会错误地输入pin码多少次。这应该很低,比如说大约三个……这将阻止人们猜测其他人的数字 如果超过6个数字,人们就会忘记它们,或者更糟糕的是,把它们写在显示器上的便条上
假设一个帐户锁定了3次错误的尝试,那么拥有一个4位数的pin加上一个用户ID组件UserId(999999)+pin(1234)会让你有3/10000的机会被人猜到。这可以接受吗?如果不将pin码长度设为5,并获得3/100000,则您似乎希望使用pin码作为用户唯一的身份识别手段。 一个可行的解决方案是使用前五位数字来识别用户, 并附加四位数字作为PIN码 如果您不想存储PIN,可以通过应用加密安全哈希(SHA1或更好)来计算PIN 用户号码加上系统范围的密码 我应该通过一些 什么样的算法 不,这是可以预测的 或者我应该随机生成它 对。使用加密随机生成器,或让用户选择自己的PIN 从理论上讲,4位数就足够了,因为ATM卡发卡机构能够用它来支持一个非常大的社区(显然,它们不可能也不需要是唯一的)。但是,在这种情况下,您应该限制尝试输入PIN的次数,并在多次尝试后将其锁定,就像银行一样。你还应该让用户提供一个用户ID(在ATM的情况下,有效地在卡上) 如果您不想以这种方式限制密码,最好放弃PIN的想法,使用标准密码(基本上就是您的PIN,只是长度很短,字符集有限)。如果你绝对必须将它限制为数字(因为你有一个PIN垫或某物),那么考虑制作4个(可配置的)最小长度,而不是固定长度。p> 您不应该将PIN存储在任何地方(例如,salt并像密码一样对其进行散列),但是由于长度较短且字符集有限,因此如果采用简单的验证方法,PIN总是容易受到暴力搜索的攻击
如果您能告诉我们更多关于您的需求(这是一个web应用程序?嵌入式系统?等),也可以使用各种其他方案。我可以建议一种替代方法吗?看一看,它提示了 您可以使用这个“原样”来生成一次性PIN,或者简单地为每个用户生成一个PIN 请记住,重复的PIN本身并不是问题:任何攻击都只需尝试多个用户ID (里程警告:我绝对不是安全专家。)
这里有第二个答案:通过重读,我假设您不需要这样的用户id——您只是在验证一组已发行的临时卡。我还假设您不想使用字母PIN 您需要选择一个PIN长度,以便猜测有效PIN的概率小于1/(您可以防止的尝试次数)。例如,如果您有一百万个有效PIN,并且您想要防止10000次猜测,那么您需要一个10位数的PIN 如果您使用John Graham Cumming的系统,您可以: