フロントエンドはクライアントの安全でない乱数を解決します。

フロントエンド プロジェクトがセキュリティの脆弱性をスキャンしているときに、クライアント側で安全でない乱数の問題が発生しました。コードを読んだところ、原因は次のとおりでした。Math.random()生成された乱数。


Baidu で調べたところ、 math.random() は実際の乱数ではなく、疑似乱数であることがわかりました。

理由

Math.random() 関数は JavaScript の組み込み関数で、0 ~ 1 (0 を含み、1 を除く) の疑似乱数を生成するために使用されます。この関数の実装はブラウザまたは JavaScript エンジンに依存し、ブラウザやエンジンが異なれば、この関数の実装に異なるアルゴリズムが使用される場合があります。
通常、Math.random() 関数は擬似乱数ジェネレーターを使用して乱数を生成します。このようなジェネレーターは通常、初期値 (シードと呼ばれる) を使用して、一連の一見乱数を生成します。生成される数値を予測しにくくするために、Math.random() 関数は外部データ (現在の時刻など) をシード値として使用することがあります。

Math.random() 関数の実装はブラウザまたはエンジンに依存するため、生成される乱数の品質も影響を受けます。一部のブラウザでは線形合同生成アルゴリズムを使用してこれを実行する場合がありますが、他のブラウザではメルセンヌ回転アルゴリズムを使用する場合があります。

つまり、ビジネスシーンによっては、この方法では本当の意味でのランダム性を実現できず、抜け穴として考えられ、それを解決する方法が考えられます。

解決

window.crypto.getRandomValues(new Uint8Array(1)) * 1
暗号化の要件を満たす安全な乱数を取得します。
この方法では 0 ~ 255 (両端を含む) の乱数が生成されるため、0 ~ 1 の乱数を取得するには、以下の値を乗算する必要があることに注意してください。 0.0039215686274509802。もちろん、0.0039 と短縮することもでき、計算方法は 1000/255 です。

おすすめ

転載: blog.csdn.net/qq_35517283/article/details/131722978