%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
Linux カーネルには乱数ジェネレータがあります。これは通常 LRNG (Linux Random Number Generator) と呼ばれます。 を呼び出すことで使用できますget_random_bytes()
。しかしstack_canary
、 と はstack_top
によって生成されますget_random_int()
。Linux カーネルには独自の優れた乱数ジェネレータ (LRNG) があるのに、なぜ Linux カーネルは によって生成するのでしょうかget_random_int()
。おそらく効率のためだと思いますが、正しいでしょうか。
答え1
ただソースを読む:
カーネル内部でのみ使用するランダムな単語を取得します。urandom に似ていますが、エントロピー プールの枯渇を最小限に抑えることを目的としています。結果として、ランダム値は暗号的に安全ではありませんが、いくつかの用途ではエントロピーを枯渇させるコストが高すぎます。
これが、get_random_int
が の出力をそのまま取らない理由get_random_bytes
です。実は、ここでの議論は 2 つの理由で間違っています。
- エントロピーは実際には減少しないそれはカーネル内部の単なる不正な計算です。
- たとえエントロピーが枯渇したとしても、アドホック構造の代わりに暗号的に安全な疑似乱数ジェネレータを使用しない理由にはなりません。 のエントロピーを枯渇させるインスタンスとは別のインスタンスを使用するだけです
/dev/random
。 パフォーマンスが理由になる可能性もありますが、Hash_DRBG/SHA-2 などの適切な CSPRNG と、ここで MD5 を使用するアドホック構造の違いはごくわずかです。
答え2
Linux の/dev/random
、、/dev/urandom
およびはget_random_bytes()
同じ内部エントロピー プールに結び付けられています。RNG のみに使用すると、プールが空になり、/dev/random
ブロックされて/dev/urandom
低エントロピー出力が生成される可能性があります。この低エントロピー状態は暗号化に問題を引き起こします。