【发布时间】:2013-03-04 16:52:10
【问题描述】:
我不想制作 1000 个密码并将它们提供给用户。 密码包含 6 位数字 - 它们看起来像随机的 6 位数字。
用户来的时候除了这个密码没有其他信息,我想验证一下。
我可以遍历数据库来查找这个密码,但是我想将这个操作的难度从 O(N) 降低到 O(1),其中 N 是密码的数量。
是否有任何方法可以生成 1000 个“可能随机”的密码并通过简单的检查方式?
UPD:现在我正在考虑进行加密。例如(Python)
key = 'top_secret'
N = 1000
passwords = [encrypt(i, key) for i in range(N)]
def check(s):
try:
return int(decrypt(s, key))<1000
except ValueError:
return False
不过这个我想有更好的解决办法
UPD2:3 位和 6 位仅为示例。它们可能是 64 位和 128 位数字
【问题讨论】:
-
这不是你想要的解决方案,而是简单地通过索引密码,你可以将搜索操作减少到O(log N)
-
如果您在 1000000 个可能的值中有 1000 个密码,这意味着 1/1000 次猜测将起作用。曾几何时,有一家名为 MetroCall 的长途电话卡公司使用 6 位代码,并为每 1000 个用户添加一个新的拨号号码,认为这“足够安全”。 25 年后,今天有很多 40 岁的人可以准确地告诉你他们的第一个调制解调器平均需要多长时间才能尝试 1000 个随机数……
-
那么 - 你实际上是在给用户一个“身份验证令牌”吗?
-
如果 N=1000 只需将密码哈希存储在内存中(set 或 dict)。 Python 中的字典查找非常接近 O(1)。这当然会将复杂性转移到内存中,这可能会成为 N 值较大的问题。
标签: python encryption hash passwords