我在哪里可以获得可靠的熵源(真正的随机性 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()
先前事件。
目前,我正在寻找一种方法来提高我的 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()
先前事件。