我在哪里可以获得可靠的熵源(真正的随机性 byte[])?

Where can I get a reliable source of entropy (real randomness byte[])?

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

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

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

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

无法访问麦克风(这需要权限)或从 random.org 获取字节(这需要互联网),我唯一能想到的就是用户 him/herself :呈现一个空白方块,让用户移动手指,指示他们尽可能随机地移动手指,最好持续几秒钟,然后使用该触摸数据。 (我似乎记得我曾经使用过的一个应用程序——TrueCrypt?——就是这样做的。)你甚至可以在它们的人类随机性之上加入一些伪随机性,以试图避免人们用非常精确的可重复动作来玩弄系统。

如果您稍微放宽要求,您可能可以从麦克风(环境噪声)and/or 加速度计中获得一些非常好的熵。当然,如果您请求网络访问,您可以从 http://random.org.

下载真正随机的数据

在 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/


或者

您可以根据用户的输入创建随机性,方法是采用 SHA256 或更高的 System.nanoTime() 先前事件。