3

HttpSessionキーの生成を実装しようとしています

1,000,000から9,999,999までの乱数を生成し、それをCookieとしてユーザーに送信します。

このプロセスを安全にすることは可能ですか?誰でもそのような乱数を作成して私のサーバーにアクセスしようとすることができます...多分私はより広い範囲が必要ですか?

もう1つの質問は、これまでに生成したことのない数をどのように生成できるかということです。現在、その番号が使用されるたびに再生成しますが、より良い方法でそれを行うことは可能ですか?

4

3 に答える 3

3

UUIDを使用します。具体的には、UUID.randomUUID()。衝突の可能性についての議論があります。

于 2010-08-08T00:22:48.380 に答える
2

基本認証を実装しようとしているように聞こえます。試してみることがあります(擬似コードで、私はWeb上のJavaが苦手です):

random_number = rand(1000000, 9999999);
secret = "Some random text here";
timestamp = unix_timestamp(); // Get a UNIX timestamp
user_ip = users_ip(); // Get the user's IP
setcookie("random_number", random_number); // Save the random number
setcookie("timestamp", timestamp);
setcookie("token", sha256(random_number + secret + timestamp + ip)); // Concat and hash everything to form a token

乱数が有効かどうかを確認する場合は、すべてのピースをまとめて、トークンと比較します。

random_number = getcookie("random_number");
secret = "Some random text here";
timestamp = int(getcookie("timestamp"));
user_ip = users_ip(); // Get the user's IP
token = sha256(random_number + secret + timestamp + ip);

if(unix_timestamp() - timestamp < 0 || unix_timestamp() - timestamp > timeout) {
    // The token is more than an hour old; it might have been stolen.
}
if(token == getcookie("token")) {
    // The user is valid
} else {
    // The user is invalid
}

このコードは、乱数が同じIPからのものであることを確認することにより、誰かが乱数をスプーフィングするのをブロックします。タイムスタンプを使用して、ユーザーのセッションが時間の経過とともに期限切れになることを確認することもできます。これにより、ハッカーが単に適切な数を生成して永久に使用するのを防ぐことができます。

秘密に関しては、それはランダムなテキストチャンクです。それは完全にランダムであり、決して共有されるべきではありません。基本的に、トークンをリバースエンジニアリングすることは事実上不可能になります(そうでない場合は、「numbertimestampip」や「ipnumbertimestamp」などの組み合わせを試す必要があります)。

また、このようなことはHMACを使用した方がうまくいく可能性がありますが、それはあなたがやろうとしていることに対していくらかやり過ぎかもしれないことにも注意する必要があります。このソリューションは、現状のままで非常に良い仕事をします。

お役に立てれば。

編集

検証が機能するには、シークレットが同じである必要があることに注意してください。

于 2010-08-08T00:59:59.130 に答える
1

私は自分自身に同じ質問をし、ここで素晴らしい答えを見つけました: JavaScriptでGUID / UUIDを作成しますか?

RFC 4122の詳細を読んで、これが意図したものであるかどうかを確認してください。私はこの疑似コードをNodeJSプロジェクトに使用しており、それが機能します。

ところで:安全を期すためには7桁以上必要です。

于 2010-08-08T21:36:45.970 に答える