我正在寻求开发一个系统,我需要为每个用户分配一个唯一的密码以确保安全性。用户只能输入此密码作为识别自己的方法。因此,我不希望用户能够猜测其他用户的密码。假设我将拥有的最大用户数是100000,这个密码应该是多长时间?
e.g。 1234 4532 3423
我应该通过某种算法生成此代码吗?或者我应该随机生成它?
基本上我不希望人们能够猜出其他人的密码并且它应该支持足够数量的用户。
很抱歉,如果我的问题听起来有点令人困惑,但很乐意澄清任何疑问。
非常感谢你。更新
阅读下面的所有帖子后,我想补充一些细节。
我无法添加额外的安全性(例如用户名和密码),因为它会阻止用户使用刮刮卡。我想尽可能地在限制范围内猜测密码。
谢谢你们所有人的回复。
答案 0 :(得分:9)
如果你将它附加到唯一的已知用户ID(可能仍然是数字),那么4个随机数字应该是充足的[按照starblue的建议]
伪随机数发生器也应该没问题。您可以使用可逆加密(AES)或单向散列
将它们存储在数据库中您主要担心的是一个人在被锁定之前可能错误地输入了多少次。这应该是低的,比如大约三个......这将阻止人们猜测其他人的数字。
任何超过6位数字的人都会忘记它们,或者更糟糕的是,将它们写在显示器上的便利贴上。
假设一个帐户锁定了3次不正确的尝试,那么拥有一个4位数的引脚加上一个用户ID组件UserId(999999)+ Pin(1234)会给你一个3/10000的机会猜测。这可以接受吗?如果不使引脚长度为5并获得3/100000
答案 1 :(得分:8)
我可以建议另一种方法吗?请查看Perfect Paper Passwords和它提示的derivatives。
您可以“按原样”使用此按钮生成一次性PIN,或者只是为每个用户生成一个PIN。
请记住,重复的PIN本身并不是一个问题:任何攻击都只需要尝试多个用户ID。
(里程警告:我绝对不是安全专家。)
这是第二个答案:从重新阅读开始,我假设你不想要这样的用户ID - 你只是在验证一组已发布的刮刮卡。我还假设您不想使用字母PIN。
您需要选择PIN长度,以便猜测有效PIN码的概率小于1 /(您可以保护的尝试次数)。因此,例如,如果您有100万个有效的个人识别码,并且您希望防止10000个猜测,那么您需要一个10位数的密码。
如果您使用John Graham-Cumming的version of the Perfect Paper Passwords系统,您可以:
我怀疑这是一个通用程序,例如,也可用于生成25个字母数字的产品ID。
很抱歉通过逐步逼近来做到这一点;我希望你能找到更接近你正在寻找的东西。
答案 2 :(得分:4)
如果我们假设最多100,000个用户,则他们可以拥有0-99,999的唯一PIN。 5位数。
然而,这样可以更容易地猜测具有最大用户数的PIN。 如果您可以限制PIN的尝试次数,那么您可以使用更短的PIN。 例如。每个IP每天最多10次失败尝试。
这还取决于你所保护的东西的价值,以及如果奇怪的东西出来的话会有多么灾难。
如果您希望保持简短或12位数字,如果您想通过自动猜测获得更多安全性,我会选择9位数字。
要生成个人识别码,我会采用高分辨率版本的时间以及一些salt和一个伪随机数,生成hash并使用前9位或12位数。确保新PIN代之间存在合理且随机的延迟,因此不会在循环中生成,如果可能,请让用户启动。
例如。左(Sha1(DateTime + Salt + PseudoRandom),9)
答案 3 :(得分:4)
到目前为止,很多很棒的答案:简单,有效,优雅!
我猜这个应用程序有点乐透,因为每个用户都会获得一张刮刮卡并用它来询问你的应用程序“他已经赢了!”因此,从这个角度来看,我想到了一些新问题:
战争拨号,或其互联网等价物:流氓用户可以反复点击您的应用,连续猜测每个10位数字吗?如果可能,请考虑限制特定位置的尝试次数。一种有效的方法可能就是拒绝回答,比如说每隔5秒从同一个IP地址进行一次尝试。这使得机器驱动的攻击效率低下,并避免了锁定问题。
锁定问题:如果您在尝试失败次数后永久锁定帐户 ,则很容易发生denial of service次攻击。除非您在一段时间后重新激活帐户,否则上述攻击者可以有效锁定每个用户。但是,只有当您的PIN由用户ID +密钥的明显串联组成时,这才是问题,因为攻击者可以尝试给定用户ID的每个密钥。这种技术也大大减少了你的密钥空间,因为只有少数PIN数字是真正随机的。另一方面,如果PIN只是一个随机数字序列,则只需将锁定应用于源IP地址。 (如果尝试失败,没有有效的帐户受到影响,那么你会“锁定”什么?)
数据存储:如果您真的在构建某种类似彩票的系统,那么只需要存储获胜的PIN !当用户输入PIN时,您可以搜索相对较小的PIN /奖品列表(或等效的)。如果经济学是正确的,您可以使用“抱歉,下次更好的运气”或“默认”奖励对待“丢失”和无效的个人识别码。
祝你好运!答案 4 :(得分:2)
问题应该是,“与攻击者猜测的数量相比,平均需要多少次猜测才能找到有效的PIN码?”
如果您生成10万个5位数代码,那么显然需要1次猜测。这不太可能足够好。
如果生成100 000个n位代码,则需要(n-5)^ 10个猜测。要弄清楚这是否足够好,您需要考虑系统如何响应错误的猜测。
如果攻击者(或者所有攻击者合并)每秒可以进行1000次猜测,那么显然n必须非常大才能阻止确定的攻击者。如果您在3次错误猜测后永久锁定其IP地址,那么由于给定的攻击者不太可能访问超过1000个IP地址,因此n = 9就足以阻止几乎所有攻击者。显然,如果您将面临分布式攻击或来自僵尸网络的攻击,那么每个攻击者1000个IP地址不再是一个安全的假设。
如果您将来需要发出更多代码(超过10万),那么显然您可以更轻松地猜测有效代码。因此,现在可能值得花一些时间来确定您未来的扩展需求,然后才能确定尺寸。
鉴于您的刮刮卡使用案例,如果用户要长时间使用该系统,我建议允许他们(或强制他们)将他们的PIN码“升级”为他们选择的用户名和密码。第一次使用该系统。然后你就可以获得用户名/密码的通常优势,而不会丢掉首次使用只需输入卡上号码的便利性。
至于如何生成数字 - 可能是你生成的每一个你要存储的数字,在这种情况下我会说随机生成它们并丢弃重复数据。如果您使用任何类型的算法生成它们,并且有人计算出算法,那么他们可以找出有效的PIN码。如果你选择一个算法,使得某人无法找出算法,那么几乎 是一个伪随机数生成器(PRNG的另一个属性是它们均匀分布,这也有帮助,因为它使猜测代码变得更难),在这种情况下你也可以随机生成它们。
答案 5 :(得分:2)
如果您使用随机数生成器算法,那么您永远不会拥有像“00038384882”这样的PIN, 以0(零)开始,因为整数从不以“0”开头。您的PIN码必须以1-9号码开头,但0。
我看到很多PIN码包括并开始很多零,所以你消除了第一百万个数字。排列需要计算消除的数量。
我认为你需要在哈希中放入0-9个数字,然后从哈希中随机获取,并输入你的字符串密码。
答案 6 :(得分:1)
如果要生成刮刮卡类型的密码,则必须使用大约13位数的大数字;而且,它们必须类似于信用卡号码,并在号码本身中嵌入校验和或验证数字。您必须有一个算法来根据一些初始数据生成一个引脚,这些数据可以是一系列数字。对于序列中的每个数字,结果引脚必须是唯一的,因此如果生成100,000个引脚代码,则它们必须全部不同。 这样,您不仅可以通过针对数据库进行检查来验证数字,还可以先验证它。
我曾经为此目的写过一些东西,我不能给你代码,但一般的想法是这样的:
现在您可以验证生成的密码。对于给定的密码,您可以生成验证数字,并根据引脚中包含的数字进行检查。如果没有问题,则可以通过执行相反的操作来提取原始数字。
这听起来不太好,因为它看起来像是默默无闻的安全,但它是你使用它的唯一方法。有人猜测一个密码并不是一个带有验证数字的12位代码,这将是非常困难的,因为你必须尝试1,000,000,000,000个组合并且你只有100,000个有效的密码,所以每个有效的密码都在那里是10,000,000个无效的。
我应该提到这对于一次性密码很有用;一个人只使用其中一个代码,例如为预付费电话充电。使用这些引脚作为身份验证令牌并不是一个好主意,特别是如果它是验证某人的唯一方法(您永远不应该只通过一个数据来验证某人;最小的是用户名+密码)
答案 7 :(得分:0)
您似乎希望使用密码作为用户识别的唯一方法。 一个可行的解决方案是使用前五位数来识别用户, 并附加四位数作为PIN码。
如果您不想存储PIN,可以通过应用加密安全散列(SHA1或更好)来计算它们 用户编号加上系统范围的密码。
答案 8 :(得分:0)
我应该通过一些代码生成此代码 算法算法?
没有。这是可以预测的。
或者我应该随机生成它?
是。使用加密随机生成器,或让用户选择自己的PIN。
理论上,4位数字将是充足的,因为ATM卡发行人设法支持一个非常大的社区(显然,他们不能也不需要是唯一的)。但是,在这种情况下,您应该限制输入PIN的尝试次数,并在银行进行多次尝试后将其锁定。而且你还应该让用户提供一个用户ID(在ATM的情况下,这有效地在卡上)。
如果你不想以这种方式限制它们,最好放弃PIN的想法并使用标准密码(这基本上就是你的PIN,只是长度非常短且字符集有限) 。如果你绝对必须将它限制在数字(因为你有一个密码键盘或其他东西),那么考虑使4 a(可配置)最小长度而不是固定长度。
您不应该将PIN存储在任何地方(例如盐和散列密码),但是考虑到长度短且字符集有限,它总是容易受到强力搜索的影响,只需简单的方法验证它。
如果您可以告诉我们更多关于您的要求(这是一个Web应用程序?嵌入式系统等等),还可以使用其他各种方案。
答案 9 :(得分:0)
猜测目标用户的PIN与任何有效用户的PIN之间存在差异。根据您的使用案例,似乎PIN用于获取对某些资源的访问权限,而攻击者可能会使用该资源,而不是用户的特定身份。如果情况确实如此,则需要在相同数字的所有可能数字中充分稀疏制作有效的PIN码。
正如在某些答案中所提到的,无论您是想从算法生成PIN,都需要使PIN足够随机。随机性通常通过PIN的熵来测量。
现在,假设您的PIN是熵 N ,系统中有 2 ^ M 个用户( M< N ),随机猜测产生有效PIN的概率是 2 ^ {MN} 。 (抱歉,乳胶符号,我希望它足够直观)。然后,从那里你可以确定该概率是否足够低,给定 N 和 M ,或者从所需的概率和 N >中号
有多种方法可以生成个人识别码,因此您无需记住所生成的每个个人识别码。但是您需要一个非常长的PIN才能确保安全。这可能不是你想要的。
答案 10 :(得分:0)
我之前使用PHP和MySQL数据库完成了这项工作。我有一个排列函数,它首先确保在开始生成过程之前能够创建所需代码的数量 - $ n,长度为$ l,字符数为$ c - 。
然后,我将每个新代码存储到数据库中,让它通过UNIQUE KEY错误告诉我,发生了冲突(重复)。然后继续,直到我已经创建了$ n个成功创建的代码。您当然可以在内存中执行此操作,但我希望保留用于MS Word邮件合并的代码。所以...然后我将它们导出为CSV文件。