我已经读过,一般来说,SecureRandom的一些实现可能会产生真正的随机数.
特别是,Android文档说
此类的实例将使用内部熵源生成初始种子,例如
/dev/urandom
但这是否意味着它会产生真正的随机数(即,而不是伪随机数)?
如果我SecureRandom以这种方式在Android中使用...
SecureRandom sr = new SecureRandom();
Run Code Online (Sandbox Code Playgroud)
...每当我打电话时,我会得到一个真正的随机输出sr.nextBoolean()吗?
或者,如果我每次都通过这样做获得输出,那么输出可能更多(或更少?)随机:
new SecureRandom().nextBoolean()?
我试图理解在SecureRandom生成器上使用UUID.randomUUID()的优点,因为前者在内部使用securerandom.
我使用以下方法生成随机字符串:
private String generateSafeToken() {
SecureRandom random = new SecureRandom();
byte bytes[] = new byte[512];
random.nextBytes(bytes);
return bytes.toString();
}
Run Code Online (Sandbox Code Playgroud)
这给出了一个长度为11的字符串,例如[B@70ffc557.如何使上面的方法返回指定长度的字符串.例如20个字符?
用户可以购买我的应用程序的"专业版".当他们这样做时,我按如下方式存储和验证他们的购买.
SecureRandom.getInstance("SHA1PRNG", "Crypto")- 这就是问题!所以,不是最好的系统,但是对于我的简陋应用程序来说,所有内容都是模糊不清的.
问题是SecureRandom.getInstance("SHA1PRNG", "Crypto")在N 上失败,因为不支持"加密".我了解到依赖于特定的提供程序是不好的做法,并且N不支持加密.哎呀.
所以我遇到了一个问题:我依赖于值种子对的加密来始终具有相同的输出.Android N不支持我使用的加密提供程序,因此我不知道如何确保N上的加密输出与其他设备上的加密输出相同.
我的问题:
我的代码:
public static String encrypt(String seed, String cleartext) throws Exception {
byte[] rawKey = getRawKey(seed.getBytes(), seed);
byte[] result = encrypt(rawKey, cleartext.getBytes());
return toHex(result); // "unlock code" which must always be the same for the same seed and clearText accross android versions
}
private static byte[] getRawKey(byte[] seed, …Run Code Online (Sandbox Code Playgroud) random android cryptography secure-random android-7.0-nougat
有很多问题询问 SecureRandom 的特定启动是否“好”,但我找不到经验法则。
创建“良好”随机 SecureRandom 的最佳方法是什么?
// Fast
// Is it a good random?
SecureRandom secureRandom = new SecureRandom()?
// Freezes for a few seconds after being used several times - until getting a random enough seed.
// See http://stackoverflow.com/questions/137212/how-to-solve-performance-problem-with-java-securerandom#comment68934647_137212
// Is it a good random?
SecureRandom secureRandom = new SecureRandom(SecureRandom.getSeed(20))?
// Freezes for a very long time. Waited minutes and still no return :(
SecureRandom secureRandom = new SecureRandom.getInstanceStrong()?
Other?
Run Code Online (Sandbox Code Playgroud) Java 9引入了一个新的名为DRBG的SecureRandom。我想用它来确定性地生成随机数。问题在于它在内部使用一个随时更改的随机数,因此对于相同的种子,我不会得到相同的数字。它的内部确实有一个选项可以设置该随机数,但是我找不到任何可以完成该操作的公共方法。如何更改该随机数?
java 应用程序执行如下操作:
\nSecureRandom random = new SecureRandom();\nfor(int i=0;i<12;i++){\n random.nextInt(19);\n}\nRun Code Online (Sandbox Code Playgroud)\n在 random.nextInt() 处,java 冻结了几分钟,似乎无限期地挂起。
\n奇怪的是,只有当我通过 Jenkins 运行它时,该行为才会出现,并且我 \xe2\x80\x99 无法在本地重现该问题。
\n在生产中代码也运行良好。
\njenkins 代理是 Ubuntu,但是如果我将其更改为 macOS 代理,它可以正常工作。
\n生产运行在 openSUSE 上。
\n这里有什么魔力?
标题几乎是对它的总结-我们可以创建java.util.Random(或SecureRandom)的一个实例,并在每次需要一个随机值时使用它,也可以在每次需要时创建一个新的实例。想知道哪种方法是首选,为什么?
让我们对上下文有一些了解:随机值是在HTTP请求处理程序内部生成的,每个请求一个,并且我正在考虑多线程的问题,寻求安全性和性能的最佳组合。
我只是对同事任务进行代码审查,并遇到了以下代码行(他正在实现基于Spring Security的登录系统).
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder(ENCODING_STRENGTH, new SecureRandom(SEED_BYTES));
}
Run Code Online (Sandbox Code Playgroud)
SecureRandom用恒定的种子初始化这个特性是一个好主意吗?我不这么认为,但不能真正解释原因.
secure-random ×10
java ×8
random ×6
android ×2
cryptography ×2
bcrypt ×1
freeze ×1
jenkins ×1
performance ×1
random-seed ×1
ruby ×1
security ×1
uuid ×1