我要找到开发一个系统在这,我需要分配的每一个用户的一个独特的密码安全。用户只会进入这个pin码作为一种手段的识别自己。因此,我不想让用户能够猜测的另一个用户使用pin码.假设的最大用户,我将是100000,多长时间应该pin码是什么?

例如1234 4532 3423

我应该产生这种代码通过某种形式的算法?或者我应该随机产生的吗?

基本上我不希望有人能猜到其他国家的人民pin码,它应该支持足够数量的用户。

很抱歉如果我的问题听起来有点混乱但是会很高兴地澄清任何怀疑。

非常感谢你。

更新

在阅读的所有职位下面,我想添加一些更详细的说明。

  1. 我想要实现的是非常类似的东西一头卡。
  2. 一个用户被给卡,这是他/她必须从头开始发现的密码。
  3. 现在使用这pin码的用户必须能够进入我的系统。

我不能增加额外的安全(例如用户名和密码),然后,它会防止用户使用的头卡。我想让它尽可能难以猜测的pin码内的局限性。

谢谢你所有你惊人的答复。

有帮助吗?

解决方案

如果我们假设最多100,000个用户,则他们可以拥有0-99,999的唯一PIN。 5位数。

然而,这样可以更容易地猜测具有最大用户数的PIN。 如果您可以限制PIN的尝试次数,那么您可以使用更短的PIN。 例如。每个IP每天最多10次失败尝试。

这还取决于你所保护的东西的价值,以及如果奇怪的东西出来的话会有多么灾难。

如果您希望保持简短或12位数字,如果您想通过自动猜测获得更多安全性,我会选择9位数字。

要生成个人识别码,我会采用高分辨率版本的时间以及一些 salt 也许是一个伪随机数,生成一个 hash 并使用前9位或12位数字。确保新PIN代之间存在合理且随机的延迟,因此不会在循环中生成,如果可能,请让用户启动。

例如。左(Sha1(DateTime + Salt + PseudoRandom),9)

其他提示

如果你将它附加到唯一的已知用户ID(可能仍然是数字),那么4个随机数字应该是充足的[按照starblue的建议]

伪随机数发生器也应该没问题。您可以使用可逆加密(AES)或单向散列

将它们存储在数据库中

您主要担心的是一个人在被锁定之前可能错误地输入了多少次。这应该是低的,比如大约三个......这将阻止人们猜测其他人的数字。

任何超过6位数字的人都会忘记它们,或者更糟糕的是,将它们写在显示器上的便利贴上。

假设一个帐户锁定了3次不正确的尝试,那么拥有一个4位数的引脚加上一个用户ID组件UserId(999999)+ Pin(1234)会给你3/10000的机会猜测。这可以接受吗?如果不使引脚长度为5并获得3/100000

我可以建议另一种方法吗?请查看 Perfect Paper Passwords 衍生品

您可以使用此<!>“; <!>;生成一次性PIN,或者只是为每个用户生成一个PIN。

请记住,重复的PIN本身并不是一个问题:任何攻击都只需要尝试多个用户ID。

(里程警告:我绝对不是安全专家。)


这是第二个答案:从重新阅读开始,我假设你不想要这样的用户ID - 你只是在验证一组已发布的刮刮卡。我还假设您不想使用字母PIN。

您需要选择PIN长度,以便猜测有效PIN码的概率小于1 /(您可以保护的尝试次数)。因此,例如,如果您有100万个有效的个人识别码,并且您希望防止10000个猜测,那么您需要一个10位数的密码。

如果您使用John Graham-Cumming的版本在完善的纸质密码系统中,您可以:

  1. 为(例如)10位十进制引脚配置此项
  2. 选择一个秘密的IV /关键短语
  3. 生成(比方说)前一百万个密码(/ PIN)
  4. 我怀疑这是一个通用程序,例如,也可用于生成25个字母数字的产品ID。

    很抱歉通过逐步逼近来做到这一点;我希望你能找到更接近你正在寻找的东西。

到目前为止,很多很棒的答案:简单,有效,优雅!

我猜这个应用程序有点像乐透,因为每个用户都会获得一张刮刮卡并用它来询问你的应用程序是否<!>“他已经赢了!<!>因此,从这个角度来看,我想到了一些新问题:

战争拨号,或其互联网等价物:流氓用户可以反复点击您的应用,连续猜测每个10位数字吗?如果可能,请考虑限制特定位置的尝试次数。一种有效的方法可能就是拒绝回答,比如说每隔5秒从同一个IP地址进行一次尝试。这使得机器驱动的攻击效率低下,并避免了锁定问题

锁定问题:如果您在尝试失败次数后永久锁定帐户 ,则您很容易拒绝服务攻击。除非您在一段时间后重新激活帐户,否则上述攻击者可以有效锁定每个用户。但是,只有当您的PIN由用户ID +密钥的明显串联组成时,这才是问题,因为攻击者可以尝试给定用户ID的每个密钥。这种技术也大大减少了你的密钥空间,因为只有少数PIN数字是真正随机的。另一方面,如果PIN只是一个随机数字序列,则只需将锁定应用于源IP地址。 (如果尝试失败,没有有效的帐户会受到影响,那么你会怎样<!>“锁定<!>”;?)

数据存储:如果您真的在构建某种类似彩票的系统,那么只需要存储获胜的PIN !当用户输入PIN时,您可以搜索相对较小的PIN /奖品列表(或等效的)。您可以对待<!>“;丢失<!>”;无效的PIN与<!>相同;对不起,下次运气更好<!>消息或<!> quot; default <!> quot;如果经济学是正确的,那就是奖励。

祝你好运!

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

如果您生成10万个5位数代码,那么显然需要1次猜测。这不太可能足够好。

如果生成100 000个n位代码,则需要(n-5)^ 10个猜测。要弄清楚这是否足够好,您需要考虑系统如何响应错误的猜测。

如果攻击者(或者所有攻击者合并)每秒可以进行1000次猜测,那么显然n必须非常大才能阻止确定的攻击者。如果您在3次错误猜测后永久锁定其IP地址,那么由于给定的攻击者不太可能访问超过1000个IP地址,因此n = 9就足以阻止几乎所有攻击者。显然,如果您将面临分布式攻击或来自僵尸网络的攻击,那么每个攻击者1000个IP地址不再是一个安全的假设。

如果您将来需要发出更多代码(超过10万),那么显然您可以更轻松地猜测有效代码。因此,现在可能值得花一些时间来确定您未来的扩展需求,然后才能确定尺寸。

鉴于您的刮刮卡使用案例,如果用户要长时间使用该系统,我建议允许他们(或强制他们)<!>升级<!>首次使用系统后,他们的PIN码为他们选择的用户名和密码。然后你就可以获得用户名/密码的通常优势,而不会丢掉首次使用只需输入卡上号码的便利性。

至于如何生成数字 - 可能是你生成的每一个你要存储的数字,在这种情况下我会说随机生成它们并丢弃重复数据。如果您使用任何类型的算法生成它们,并且有人计算出算法,那么他们可以找出有效的PIN码。如果你选择一个算法,使得某人无法找出算法,那么几乎 是一个伪随机数生成器(PRNG的另一个属性是它们均匀分布,这也有帮助,因为它使猜测代码变得更难),在这种情况下你也可以随机生成它们。

如果您使用随机数生成器算法,那么您永远不会拥有像<!>这样的PIN; 00038384882 <!> , 以0(零)开头,因为整数从不以<!>“0 <!>”开头。您的PIN码必须以1-9号码开头,但0。

我看到很多PIN码包括并开始很多零,所以你消除了第一百万个数字。排列需要计算消除的数量。

我认为你需要在哈希中放入0-9个数字,然后从哈希中随机获取,并输入你的字符串密码。

如果你想产生的头-卡型pin码,然后你必须用大号码,有关13位长;而且,他们必须以类似于信用卡号码,具有校验或核查数字嵌入式的数目本身。你必须有一个算法产生的销根据一些初步数据,这些数据可以是一个顺序的号码。得到的针必须是唯一的每个数字的顺序,这样,如果产生100,000pin码,他们所有人都必须是不同的。这样你就可以验证的数量不仅通过检查它对一个数据库,但你可以验证一下。

我曾写过的东西为此目的,我不能给你代码,但总的想法是这样的:

  • 准备一个空间的12位
  • 格式的数目为五位数(00000到99999)和传播它沿空间在一个特定的方式。例如,数12345可以传播__3_5_2_4__1.你可以改变你的方式传播的数量取决于它是否是一个偶数或奇数,或多3,等等。
  • 基于价值的某些数字,产生更多的数字(例如,如果第三位甚至是,那么创造奇数,并把它放在第一个开放的空间,否则建立一个甚至数目,并把它放在第二次开放的空间,例如_83_5_2_4__1
  • 一旦你已经产生了6位数,则将只有一个开放的空间。你应该始终保持同样的开放空间(例如在下一个空间)。你将把验证数字。
  • 产生的验证数字必须执行的一些算法运算数你已经产生,例如加入所有数字在奇数位置和乘他们通过其他一些数量,则减去所有数字甚至立场,并最后加入的所有数字合在一起(必须改变的算法的一个小小的基于价值的定位数字)。最后你有一个验证数字,其中包括在产生pin码。

所以现在你可以验证你的生pin码。对于给定pin码,则产生的核查数字,并检查它对包含在销。如果这是确定的,然后你就可以提取原始数通过执行反向操作。

它听起来不太好,因为它看起来像安全通过默默无闻但这是唯一的方法可以使用这个。这不是不可能的人来猜猜密码但作为一个12位数代码有一个核查数字,这将是非常困难,因为你要尝试于1,000,000,000,000的组合和你只有100 000名有效pin码,使每个有效的pin码有10,000,000的无效的。

我应该说这是用于一次性pin码;一个人使用这些代码,只有一次,例如收取预付费电话。这不是一个好主意使用这些销作为身份验证标记,特别是如果这是唯一的方法进行验证的人(你应该永远不进行身份验证的人只有通过一个单片的数据;最起码为用户名+password)

您似乎希望使用密码作为用户识别的唯一方法。 一个可行的解决方案是使用前五位数来识别用户, 并附加四位数作为PIN码。

如果您不想存储PIN,可以通过应用加密安全散列(SHA1或更好)来计算它们 用户编号加上系统范围的密码。

  

我应该通过一些代码生成此代码   算法算法?

没有。这是可以预测的。

  

或者我应该随机生成它?

是。使用加密随机生成器,或让用户选择自己的PIN。

理论上,4位数字将是充足的,因为ATM卡发行人设法支持一个非常大的社区(显然,他们不能也不需要是唯一的)。但是,在这种情况下,您应该限制输入PIN的尝试次数,并在银行进行多次尝试后将其锁定。而且你还应该让用户提供一个用户ID(在ATM的情况下,这有效地在卡上)。

如果你不想以这种方式限制它们,最好放弃PIN的想法并使用标准密码(这基本上就是你的PIN,只是长度非常短且字符集有限) 。如果你绝对必须将它限制在数字(因为你有一个密码键盘或其他东西),那么考虑使4 a(可配置)最小长度而不是固定长度。

您不应该将PIN存储在任何地方(例如盐和散列密码),但是考虑到长度短且字符集有限,它总是容易受到强力搜索的影响,只需简单的方法验证它。

如果您可以告诉我们更多关于您的要求(这是一个Web应用程序?嵌入式系统等等),还可以使用其他各种方案。

猜测目标用户的PIN与任何有效用户的PIN之间存在差异。从您的使用案例来看,似乎PIN用于获取对某些资源的访问权限,而攻击者可能会使用该资源,而不是用户的特定身份。如果情况确实如此,则需要在相同数字的所有可能数字中充分稀疏制作有效的PIN码。

正如在某些答案中所提到的,无论您是想从算法生成PIN,都需要使PIN足够随机。随机性通常通过PIN的来测量。

现在,假设您的PIN是熵 N ,系统中有 2 ^ M 个用户( M <!> lt; N ),随机猜测产生有效PIN的概率是 2 ^ {MN} 。 (抱歉,乳胶符号,我希望它足够直观)。然后,从那里你可以确定该概率是否足够低,给定 N M ,或者从所需的概率和 N >中号

有多种方法可以生成个人识别码,因此您无需记住所生成的每个个人识别码。但是您需要一个非常长的PIN才能确保安全。这可能不是你想要的。

我之前使用PHP和MySQL数据库完成了这项工作。我有一个排列函数,它首先确保在开始生成过程之前能够创建所需代码的数量 - $ n,长度为$ l,字符数为$ c - 。

然后,我将每个新代码存储到数据库中,让它通过UNIQUE KEY错误告诉我,发生了冲突(重复)。然后继续,直到我已经创建了$ n个成功创建的代码。您当然可以在内存中执行此操作,但我希望保留用于MS Word邮件合并的代码。所以...然后我将它们导出为CSV文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top