Update #5: JEP 123: SecureRandom Draft and Implementation.

Brad Wetmore bradford.wetmore at oracle.com
Thu Apr 11 20:10:29 UTC 2013



On 4/11/2013 3:12 AM, Florian Weimer wrote:
> On 04/11/2013 12:07 AM, Brad Wetmore wrote:
>> Hi Florian,
>>
>>  > I wonder if this change to src/share/lib/security/java.security-linux
>>  >
>>  > -securerandom.source=file:/dev/urandom
>>  > +securerandom.source=file:/dev/random
>>  >
>>  > causes the return of the blocking behavior.
>>
>> Welcome to my "can of worms." [1]  I hope everything I've said below is
>> correct, and haven't made any typos!
>
> Yay for crypto pluggability. 8-/

If you were around pre-JDK 1.3.1_09/1.4, the SecureRandom performance is 
much better compared to ThreadedSeedGenerator.

> Rather than trying to find out what the code does, I tested your changes
> on Fedora 18, and here is what I found:
>
> new SecureRandom() does not block for seeding.  It reads straight from
> /dev/urandom, so it may have some impact on the kernel entropy pool.

I'm assuming you're using the default configuration, and using 
nextBytes() and not generateSeed()?  Then NativePRNG does read from 
/dev/urandom.

The Linux entropy pool has been a bit of a black box for me.  The latest 
I've read on it was "Analysis of the Linux Random Number Generator" by 
Gutterman, et.al. in 2006.  From what I understand, reads of 
/dev/urandom will indeed pull from the primary pool.  But if that's 
followed by a large of /dev/random, there's nothing in the primary pool 
to refill it.

Maybe you would know the answer to this question.  It used to be that 
the Linux entropy pools was refilled by keyboard/mouse/interrupts/disk 
activity.  On a lights-out/headless system, the first two didn't 
contribute.  There were not many kernel modules that fed the interrupts, 
so most of the entropy came from disk.  I know some vendors are adding 
network info, but from what I understand, that's not standard.  Have 
there been changes in more recent versions of Linux?

> SecureRandom.getInstance("SHA1PRNG") may block for seeding, but only
> once during startup.  After that, it does not obtain entropy from the
> kernel.

Correct.  I omitted mentioning the details for fear of causing even more 
confusion, but since you hinted at it: there is a system-wide seeder for 
initializing future SHA1PRNGs 
(sun.security.provider.SecureRandom$SeederHolder) that is itself a 
SHA1PRNG and needs to be seeded via the system entropy and the 
Native/URL/ThreadedSeedGenerator.  Once that has been seeded (via 
/dev/random by default), it generates seeds (using the 
SHA1PRNG.nextBytes()) for future SHA1PRNGs (without going through 
/dev/random).  However, calls to SecureRandom.generateSeed() will still 
always go to the Native/URL/ThreadedSeedGenerator.

When doing this project, there were many times where I said:  "Looks 
like I picked a bad week to..."  [1]

> This matches the behavior of OpenJDK 7 in that Fedora version.
>
> However, I noticed that /dev/{u,}random is opened three times each (and
> the file descriptors are kept open).

What was your application code?  Any configuration I should be aware of?

Oops, just realized there's an optimization in NativePRNG/friends.  If 
the seedFile/nextfile are both pointing to the same file, we don't need 
to open it twice.  I've filed bug JDK-8012042.  Might be able to 
optimize it further.

Brad

[1] This quote is from a classic American comedy movie called 
"Airplane."  http://www.youtube.com/watch?v=VmW-ScmGRMA




More information about the security-dev mailing list