我在哪里可以得到可靠的熵源(真正的随机字节)?

目前,我正在寻找一种方法来提高我的Android应用程序(纸牌游戏) 的随机性质量 。 以前,据估计,对于我的情况(52!置换),需要至少226位熵(226个随机位)。

我打算使用这个byte[]作为SecureRandom的种子:

 SecureRandom random = new SecureRandom(); random.setSeed(/* insert seed here, byte[] */) 

问题是 – 在Android上哪里可以可靠地获得此数量的随机位(至少226位),最好不需要任何权限和没有互联网。 此外,无论设备和API级别如何,它都应该工作。

在Java 8+上,您可以使用

 SecureRandom rand = SecureRandom.getInstanceStrong(); 

在您的平台上获得最强的随机性。 要明确你可以使用

 SecureRandom rand = SecureRandom.getInstance("NativePRNGBlocking"); 

它在Linux系统上使用/dev/random的熵。 但是,如果没有,我预计会失败。

https://www.synopsys.com/blogs/software-security/proper-use-of-javas-securerandom/


另外

您可以通过获取先前事件的System.nanoTime()的SHA256或更高版本,根据用户的输入创建随机性。

无法访问麦克风(这将需要权限)或从random.org (这将需要互联网)抓取字节,我唯一能想到的是用户他/她自己:呈现一个空白的方块,用户移动他们的手指交叉,指示他们尽可能随机地做,最好是几秒钟,然后使用触摸数据。 (我似乎记得我曾经使用的一个应用程序–TrueCrypt? – 这样做。)你甚至可以在他们的人类随机性之上抛出一些伪随机性,试图避免人们以极其精确的可重复动作游戏系统。

如果你稍微放松一下你的要求,你可能会从麦克风(环境噪音)和/或加速度计中获得一些非常好的熵。 当然,如果您请求网络访问,您可以从http://random.org下载真正的随机数据。