【问题标题】:Where can I get a reliable source of entropy (real randomness byte[])?我在哪里可以获得可靠的熵源(真正的随机性字节 [])?
【发布时间】:2019-01-18 02:58:11
【问题描述】:

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

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

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

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

【问题讨论】:

  • 请不要在title中重复android tag
  • "...最好不需要任何权限,也不需要互联网..." 我非常怀疑你能做到。例如,您需要获得权限才能使用麦克风来拾取环境噪音,或者需要互联网才能使用 random.org 或类似...
  • @KlingKlang - 但我正在寻找专门针对 Android 的答案。在标题中这样表述不正确吗?
  • @KlingKlang - 好的,谢谢您的指导..
  • SecureRandom 在 Linux 和很可能在 Android 上使用 /dev/random

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


【解决方案1】:

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

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

【讨论】:

  • 如果他们不关心权限,从 mic 或 ACCELEROMETER 数据中获取字节流,然后将其添加到伪随机数中似乎效果很好。
  • 非常好的一点,也许我可以根据上一轮游戏中的动作生成随机字节..
【解决方案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/


或者

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

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 2011-02-24
    相关资源
    最近更新 更多