15

パスワード リセットの検証プロセスを作成しようとしています。使用したのはエポック タイムの 2 つの値で、ユーザーの古いパスワード (pbkdf2) をキーとして使用したいのですが、

ASCII以外の文字を取得したくないので、SimpleEncodeライブラリを使用しました。これはキーが使用されたBASE64のみであるため高速であるためですが、問題はパスワードが長すぎることです(196文字)ので、長いキーを取得します!

私がやったことは結果を分割することcode = simpleencode.encode(key,asci)[::30]ですが、これは一意ではありません!

それがどのように機能するかを理解するために、Facebookのリセットプロセスを試しましたが、与えられたのは数字です! では、このプロセスがどのように機能するかというと、誰かが誰かのパスワードをリセットするためのリンクを偽造するのを困難にするために鍵を使用していませんか?

更新: アルゴリズムの仕組み:

1-エポッシュを使用して時間を取得するtime.time()

2- (URL に使用する) エポック時間の Base64 とエポック時間値 + キーを生成します。このキーは PBKDF2(パスワード) です。

3- URL www.example.com/reset/user/Base64(time.time()) を生成し、この URL とsimpleencode.encode(key,asci)[::30]

4- ユーザーが URL をクリックすると、生成されたコードが入力されます。この生成されたコードが URL と一致する場合は、パスワードを変更させます。そうでない場合は、URL を忘れてしまいます。

4

3 に答える 3

33

それが最善の方法かどうかはわかりませんが、おそらく UUID4 を生成するだけで、URL でパスワードをリセットして「n」時間後に期限切れにすることができます。

>>> import uuid
>>> uuid.uuid4().hex
'8c05904f0051419283d1024fc5ce1a59'

http://redis.ioのようなものを使用してそのキーを保持し、適切なユーザー ID の値を保持し、有効期限を設定できます。したがって、何かがhttp://example.com/password-reset/8c05904f0051419283d1024fc5ce1a59から入ってくると、それが有効かどうかを確認し、有効な場合は変更を許可して新しいパスワードを設定します。

「検証ピン」が必要な場合は、トークンとともに、小さなランダム キーを保存します。

>>> from string import digits
>>> from random import choice
>>> ''.join(choice(digits) for i in xrange(4))
'2545'

そして、リセットリンクに入力されるリクエスト。

于 2013-02-05T18:07:01.153 に答える
21

最も簡単な方法は、ItsDangerousライブラリを使用することです。

ニュースレターの購読を解除するためのユーザー ID を URL にシリアライズして署名できます。この方法では、ワンタイム トークンを生成してデータベースに保存する必要はありません。アカウントや同様のもののあらゆる種類のアクティベーションリンクで同じこと.

タイムスタンプを埋め込むこともできるため、データベースやキューを使用することなく、非常に簡単に期間を設定できます。すべて暗号署名されているため、改ざんされているかどうかを簡単に確認できます。

>>> from itsdangerous import TimestampSigner
>>> s = TimestampSigner('secret-key')
>>> string = s.sign('foo')
>>> s.unsign(string, max_age=5)
Traceback (most recent call last):
  ...
itsdangerous.SignatureExpired: Signature age 15 > 5 seconds
于 2013-02-05T22:10:59.740 に答える