基本認証を実装しようとしているように聞こえます。試してみることがあります(擬似コードで、私は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を使用した方がうまくいく可能性がありますが、それはあなたがやろうとしていることに対していくらかやり過ぎかもしれないことにも注意する必要があります。このソリューションは、現状のままで非常に良い仕事をします。
お役に立てれば。
編集
検証が機能するには、シークレットが同じである必要があることに注意してください。