web-dev-qa-db-ja.com

Pythonで一意の認証トークンを生成する方法は?

トークンベースの認証をflask for my Android appで記述しようとしています。そのために、ユーザーを確認するために使用する一意のトークンが必要です。

Itsdangerousライブラリは、JWTトークンを作成できるJSONWebSignatureSerializer関数を提供します。私の最初の質問は、モバイルベースの認証にJWTを使用しても安全ですか?

次に、Django= RESTフレームワークがトークンを生成する方法について少し調査しました。

def generate_key(self):
    return binascii.hexlify(os.urandom(20)).decode()  

このトークンは一意ですか、それとも単なるランダムですか?モバイルベースの認証にはどちらを使用すればよいですか?

pythonでモバイルアプリケーションの一意のトークンを生成するための基本的な方法は何ですか?

6
Saprative Jana

組み込みのuuidモジュールのように使用できます。 3.6でリリースされた新しいsecretsモジュールは、一意のトークンを作成することもできます。

from uuid import uuid4

Rand_token = uuid4()

以下の関数は、呼び出されるたびに一意のトークンを作成します。 os.urandomメソッドはランダムな20バイトを文字列として返し、binascii.hexlifyメソッドはそれらの20バイトのそれぞれをそのバイトの2桁の16進表現に変換します。これが、戻り値が2倍になる理由です。

このアプローチを使用したい場合で、トークンを特定の長さにする必要がある場合は、os.urandomメソッドの引数として、必要な長さのhalfを使用します。

def generate_key(self):
    return binascii.hexlify(os.urandom(20)).decode()
7
Sean Parsons

これは古いですが、とにかく私は鳴き声を上げています。決定する必要があります:一意にしますか、ランダムにしますか? 1つ選択してください。

一意にする場合は、UUIDを使用します。 UUIDの主な目的は、ユニークなものを確実に生成することです。 UUIDはUniversally Unique IDの略です。

ランダムなものが必要な場合は、os.urandom。真にランダムな結果を一意性の制約に限定することはできません。それはそれらをランダムにしないでしょう。実際、それらはUUIDになります。

さて、あなたの質問のために、あなたは認証トークンを求めています。つまり、セキュリティの目的でこれを使用しています。 UUIDは間違ったソリューションであり、安全な番号を生成することが適切です。 UUIDの代わりに乱数を生成するときに衝突が発生しませんか?はい。しかし、膨大な数のユーザーがいない限り、そうなることはありません。あなたはこれについてあなたの計算をしたいと思うでしょう、しかし私の推薦は:あなたがランダムを使うつもりであるときUUIDを使わないでください。

オイ。

3
mlissner

Uuid()ライブラリを見てください。ドキュメントはこちらです:

https://docs.python.org/2/library/uuid.html

そして質問の以前の議論はここにあります:

PythonでGUID/UUIDを作成する方法

細部までこだわっています。

2
vielmetti