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

パスワードが短いため、ビットマップを使用することをお勧めします。1000000ビット=125000バイト〜= 122kB、つまりかなり少量のメモリが必要です。

したがって、ビットマップを作成して初期化します(完全に未設定)。パスワードを生成し、ビットマップに適切なビットを設定します。ユーザーがログインしようとしたときにビットマップを確認します。

非常に重要な警告!

ここであなたがやろうとしていることは、非常に安全ではありません。

ユーザーは自分のパスワードを使用してログインするだけなので、パスワードを保持するために選択したデータ構造に関係なく、システムにログインするには1つのパスワードを推測するだけで済みます。[0; 1000000 [の範囲に1000が存在するため、最初の試行でパスワードを推測する確率は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

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

パスワードが数字のみの場合は、それらをリストのインデックスとして使用できます。

# 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!'

6 桁のパスワードはあまり安全ではないことに注意してください。それらは簡単に推測できます。

より良いアプローチは、ユーザーにパスフレーズを選択させることです。次に、そのパスフレーズの SHA512 ハッシュを dict のキーとして保存します。たとえば、ユーザーのデータを値として保存します。ユーザーがパスフレーズを指定したら、それをハッシュして、そのキーが辞書にあるかどうかを確認します。

于 2013-03-15T21:10:46.563 に答える