0

我不想制作 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 位数字

4

4 回答 4

0

不是 100% 确定,但您可以生成一个uuid4并将其存储为身份验证-> 用户名查找,例如:

import uuid

userpass = {uuid.uuid4().hex:'user{:05}'.format(idx) for idx in xrange(1, 1001)}
an_item = next(iter(userpass)) # one we know is in there
for check in (an_item, 'bob'): # 'bob' we know won't be...
    print check, 'belongs to', userpass.get(check, '*nobody*')

# 8411d50aa7ec42d8a6b4736284d1837b belongs to user00381
# bob belongs to *nobody*
于 2013-03-15T22:34:39.590 回答
0

由于密码很短,您可能需要使用位图。您需要 1000000 位 = 125000 字节 ~= 122kB,即相当少量的内存。

因此,创建一个位图并初始化它(完全未设置)。生成您的密码并在位图中设置适当的位。当用户尝试登录时检查位图。

非常重要的警告!

您在这里尝试做的是EXTREMELY UNSECURE

您写道,用户仅使用其密码登录,因此,与您选择保存密码的数据结构无关,登录系统只需尝试猜测一个密码。由于 1000 存在于 [0;1000000[ 范围内,第一次尝试猜测密码的概率为 0,001,这是一个非常高的值。本质上,正如您所描述的,您的系统不要求输入密码 - 它要求输入用户名。

在某些情况下,6 位密码可能是可以的,但切勿将密码用作用户名+密码。

于 2013-03-16T17:59:07.910 回答
0

创建一个以密码为键的哈希。在 Perl 中的示例中,散列提供恒定时间查找 (O(1))。

这可能看起来像这样:

my %pass;

foreach ( 1 .. 1000 ) {
        # generate_next_pass() is your algorithm
        # of getting new password.
        my $p = generate_next_pass();
        $pass{$p} = 1;
}

然后 O(1) 检查密码是否在哈希中:

# $user_input is a password to be validated.
if ( exists $pass{$user_input} ) {
  # password correct
} else {
  # password incorrect
}
于 2013-03-15T20:34:51.507 回答
0

如果密码只有数字,您可以将它们用作列表索引:

# Create a list of all possible passwords
pwds = [False for n in xrange(10**6)]
# Make 1000 valid passwords
for j in xrange(1000):
    i = random.randint(0, 10**6)
    print 'password is {:06d}'.format(i)
    pwds[i] = True

查找它们应该是 O(1):

testpw = '103076'
if pwds[int(testpw)]:
    print 'Password is OK'
else:
    print 'Invalid password!'

请注意,六位数密码不是很安全。他们很容易被猜到。

更好的方法是让用户选择密码。然后将该密码的 SHA512 散列存储为字典的键,例如用户的数据作为值。当用户给出其密码时,对其进行散列并查看该密钥是否在字典中。

于 2013-03-15T21:10:46.563 回答