在哪里可以获得可靠的熵源(实际随机字节[])?

时间:2018-08-10 13:15:54

标签: java android random random-seed secure-random

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

我打算将此byte[]用作SecureRandom的种子:

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

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

2 个答案:

答案 0 :(得分:2)

在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()来基于用户的输入来创建随机性。

答案 1 :(得分:1)

在无法访问麦克风(需要权限)或无法从random.org抓取字节(需要互联网)的情况下,我唯一想到的就是用户自己:空白用户将手指移开,指示他们尽可能随机地(理想情况下持续几秒钟)并使用该触摸数据。 (我似乎还记得我曾经使用过的一个应用程序-TrueCrypt?-做到了这一点。)您甚至可以在他们的人为因素之上抛出一些伪随机性,以免人们以异常精确的可重复动作来玩系统。 >

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