從 Lobste.rs 上看到的文章,在講 Dart 的 PRNG 問題:「Far From Random: Three Mistakes From Dart/Flutter's Weak PRNG」。
主要的經驗有兩組,第一個是 PRNG 與 CSPRNG 的差異,後者保證了難以預測的特性 (cryptographically secure),有希望不被猜到的情況不應該用 Random
而應該都要用 Random.secure
。
不過文章裡面提到這邊舊版的 Dart 的 Random
直接設死 seed,也是有點...:
// TODO: Make this actually random static int _initialSeed() => 0xCAFEBABEDEADBEEF;
新版透過 _jsMath.random()
產生 seed,至少不會每次跑都一樣,就 PRNG 來說算是夠用了。
第二個是 entropy 要夠多,不要亂 truncate,不然就會像文章裡面看到只剩下 32 bits 的可能性,就很容易被窮舉硬找出來。
然後現在的程式語言大多都有支援 CSPRNG 的 class/function/library/plugin 可以用,要用的時候可以找一下。