Security 引脚生成

Security 引脚生成,security,encryption,random,cryptography,Security,Encryption,Random,Cryptography,我期待着开发一个系统,我需要分配给每个用户一个唯一的pin码的安全。用户将只输入此pin码作为识别自己的一种方式。因此,我不希望用户能够猜到其他用户的pincode。假设我的最大用户数是100000,那么这个pin码应该有多长 e、 g.1234 4532 3423 我应该通过某种算法生成这个代码吗?或者我应该随机生成它 基本上,我不希望人们能够猜测其他人的pincode,它应该支持足够数量的用户 如果我的问题听起来有点混乱,我很抱歉,但我很乐意澄清任何疑问 多谢各位 更新 在阅读了下面所有的帖

我期待着开发一个系统,我需要分配给每个用户一个唯一的pin码的安全。用户将只输入此pin码作为识别自己的一种方式。因此,我不希望用户能够猜到其他用户的pincode。假设我的最大用户数是100000,那么这个pin码应该有多长

e、 g.1234 4532 3423

我应该通过某种算法生成这个代码吗?或者我应该随机生成它

基本上,我不希望人们能够猜测其他人的pincode,它应该支持足够数量的用户

如果我的问题听起来有点混乱,我很抱歉,但我很乐意澄清任何疑问

多谢各位

更新

在阅读了下面所有的帖子之后,我想补充一些细节

  • 我试图实现的是一个非常类似于刮刮卡的东西
  • 用户收到一张卡,他/她必须抓取该卡才能找到pin码
  • 现在使用此pin码,用户必须能够访问我的系统
  • 我无法添加额外的安全性(例如用户名和密码),因为这样会阻止用户使用刮刮卡。我想让它尽可能难以猜测限制内的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的系统,您可以:

  • 为(比如)10位十进制管脚配置此选项
  • 选择一个秘密/关键短语
  • 生成(比如)前一百万个密码(/PINs)
  • 我怀疑这是一个通用的过程,例如,可以用来生成25个字母数字的产品ID

    对不起,用逐次逼近法;我希望这更接近您所要查找的内容。

    问题应该是,“与攻击者的猜测次数相比,平均需要多少次猜测才能找到有效的PIN码?”

    如果你生成10万个5位数的代码,那么很明显,这需要一次猜测。这可能不够好

    如果生成100000个n位代码,则需要(n-5)^10次猜测。要想知道这是否足够好,你需要考虑你的系统是如何做出错误猜测的。 如果一个攻击者(或所有攻击者加起来)每秒可以猜1000次,那么显然n必须相当大才能阻止一个下定决心的攻击者。如果你永久锁定他们的IP地址后