CSRF トークンの作成方法について質問があります。
uniqid
や rand
などは論外で random_bytes
を使う前提です。
【質問1】CSRF トークンの作成方法による違いはありますか?
CSRF トークンの作成方法として主に 3 つの方法を見かけました。
bin2hex
徳丸先生が teratail で回答していた bin2hex
で 16 進数表記にするパターンです。
bin2hex(random_bytes(32))
ハッシュ関数
mpyw 先生の記事でサンプルコードとして紹介しているハッシュ関数を通すパターンです。
sha1(random_bytes(30))
引用:Qiita - これで完璧!今さら振り返る CSRF 対策と同一オリジンポリシーの基礎
base64_encode
Laravel のコードですが、base64_encode
を使ってごにょごにょしています。
抜粋しているので、詳細のコードは引用元を参照してください。
public static function random($length = 16) { $string = ''; while (($len = strlen($string)) < $length) { $size = $length - $len; $bytes = random_bytes($size); $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size); } return $string; }
3 つの方法を見かけましたが、セキュリティ面での違いなどあるのでしょうか?
いずれも random_bytes
でトークンを生成しているので、どれもトークンとしては問題ないと思っているのですが、どうなのでしょうか。
【質問2】random_bytes の適切なバイト数はいくつですか?
random_bytes
で生成される文字列の長さですが、30
バイト以上にしている記述を見かけます。
何バイトから安全と言えるのでしょうか?
なぜ、そのバイト数なのかも教えていただけると嬉しいです。
ご存じの方いれば、教えてください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/13 10:59
2019/09/14 06:09
退会済みユーザー
2019/09/14 06:17 編集
2019/09/14 07:18
2019/09/14 09:03