代码之家  ›  专栏  ›  技术社区  ›  Sergey Emeliyanov

哪里可以得到可靠的熵源(真正的随机字节[])?

  •  2
  • Sergey Emeliyanov  · 技术社区  · 6 年前

    目前,我正在寻找一种方法来增加 随机性 在我的 Android 应用程序(纸牌游戏)。之前,据估计,对于我的情况(52!置换)至少需要226位熵(226个随机位)。。

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

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

    问题是 --我在哪里可以可靠地得到这个数量的随机位(至少226位) 安卓 ,最好不需要任何权限,也不需要internet。而且,不管设备和API级别如何,它都应该可以工作。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Peter Lawrey    6 年前

    在Java8+上,您可以使用

    SecureRandom rand = SecureRandom.getInstanceStrong();
    

    在你的平台上获得最强的随机性。明确地说,你可以使用

    SecureRandom rand = SecureRandom.getInstance("NativePRNGBlocking");
    

    利用熵 /dev/random 在类似Linux的系统上。但是,如果没有,我希望它会失败。

    https://www.synopsys.com/blogs/software-security/proper-use-of-javas-securerandom/


    或者

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

        2
  •  1
  •   T.J. Crowder    6 年前

    无法访问mic(需要权限)或从 random.org (这需要互联网),我唯一能想到的是用户他/她自己:呈现一个空白方块,让用户移动手指,指示他们尽可能随机地做,最好是几秒钟,然后使用触摸数据。(我好像还记得我以前用过的一个应用——TrueCrypt?-你甚至可以在人类随机性的基础上加上一些伪随机性,以避免人们用极其精确的可重复运动来玩这个系统。

    如果你稍微放松一下你的要求,你可能会从麦克风(环境噪音)和/或加速度计中得到一些很好的熵。当然,如果你请求网络访问,你可以从 http://random.org .