私のチームはランダムトークンを生成するサーバー側のコード(Javaで)を渡されましたが、それについて質問があります-
これらのトークンの目的はかなり機密性が高く、セッションID、パスワードリセットリンクなどに使用されます。したがって、誰かがトークンを推測したり、ブルートフォースで実行したりしないように、暗号的にランダムにする必要があります。トークンは「長い」ため、64ビット長です。
コードは現在、java.util.Random
クラスを使用してこれらのトークンを生成しています。ドキュメントのためのjava.util.Random
明確では次のように述べています:
java.util.Randomのインスタンスは暗号的に安全ではありません。代わりにSecureRandomを使用して、セキュリティ上重要なアプリケーションで使用するための暗号的に安全な疑似乱数ジェネレータを取得することを検討してください。
ただし、コードが現在使用している方法java.util.Random
はこれです。クラスをインスタンス化java.security.SecureRandom
し、SecureRandom.nextLong()
メソッドを使用して、java.util.Random
クラスのインスタンス化に使用されるシードを取得します。次に、java.util.Random.nextLong()
メソッドを使用してトークンを生成します。
だから今私の質問-がjava.util.Random
使用してシードされていることを考えると、それはまだ安全java.security.SecureRandom
ですか?java.security.SecureRandom
トークンの生成にのみ使用するようにコードを変更する必要がありますか?
現在、コードシードRandom
は起動時に1回です
Random
は起動時に一度シードするのですか、それともトークンごとに新しいシードをシードするのですか?うまくいけば、これは愚かな質問ですが、私はチェックしたいと思いました。
long
つまり、すべての可能なdouble
値または値が生成されるわけではありません。