目前,我正在寻找一种方法来提高我的Android
应用程序(纸牌游戏)中的随机性。以前,据估计,对于我的情况(52!排列),至少需要226位熵(226个随机位)。.
我打算将此byte[]
用作SecureRandom
的种子:
SecureRandom random = new SecureRandom();
random.setSeed(/* insert seed here, byte[] */)
问题是-我在哪里可以可靠地在Android
上获得此数量的随机位(至少226位),最好不需要任何许可,也不需要互联网。此外,无论设备和API级别如何,它都可以正常工作。
答案 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下载真正的随机数据。