GithubHelp home page GithubHelp logo

marschall / getrandom-provider Goto Github PK

View Code? Open in Web Editor NEW
4.0 3.0 0.0 202 KB

A SecureRandomSPI that makes the getrandom() system call available to SecureRandom.

C 19.10% Java 80.90%
java jce linux secure-random-generator

getrandom-provider's Introduction

getrandom() SecureRandomSPI Maven Central Javadocs

A SecureRandomSPI that makes getrandom() system call available to SecureRandom.

  • uses syscall, does not depend on glibc wrapper
  • tries to use stack allocation rather than allocation on the C heap
  • is marked as thread safe so concurrent access through SecureRandom will not synchronize in Java 9 and later, however there seems to be a kernel lock on /dev/urandom so you will likely not get additional parallelism
  • unlike the NativePRNG variants
    • does not use a file handle
    • does not have a global lock, but see comments on the kernel lock above
    • does not additionally mix with SHA1PRNG
    • blocks until the urandom source has been initialized
    • zeros out native memory
  • supports the ServiceLoader mechanism
  • is a Java 9 module but works on Java 8
  • no dependencies outside the java.base module

Likely benefits from random number generator enhancements for Linux 5.17 and 5.18.

Usage

A nonblocking (/dev/urandom) instance of the provider can be acquired using

SecureRandom.getInstance("geturandom"); // GetrandomProvider.GETURANDOM

Alternatively a blocking (/dev/random) instance of the provider can be acquired using

SecureRandom.getInstance("getrandom"); // GetrandomProvider.GETRANDOM

The /dev/urandom variant is the preferred one, the /dev/random variant is only added for completeness, see Myths about /dev/urandom.

Configuration

The provider can be configured in two different ways

  1. programmatic configuration
  2. static configuration

For best startup performance it is recommended to extract the .so from the JAR and add it to a folder present in the LD_LIBRARY_PATH environment variable or the java.library.path system property. Otherwise this library will extract the .so to a temporary folder the first time it is called.

Programmatic Configuration

The provider can be registered programmatically using

Security.addProvider(new GetrandomProvider());

Static Configuration Java 8

The provider can be configured statically in the java.security file by adding the provider at the end

security.provider.N=com.github.marschall.getrandom.GetrandomProvider

N should be the value of the last provider incremented by 1. For Oracle/OpenJDK 8 on Linux N should likely be 10.

This can be done per JVM installation or per JVM Instance.

Note that for this to work the provider JAR needs to be in the class path or extension folder.

Static Configuration Java 9+

The provider can be configured statically in the java.security file by adding the provider at the end

security.provider.N=getrandom

N should be the value of the last provider incremented by 1. For Oracle/OpenJDK 9 on Linux N should likely be 13.

This can be done per JVM installation or per JVM Instance.

The provider uses the ServiceLoader mechanism therefore using the getrandom string is enough, there is no need to use the fully qualified class name.

Note that for this to work the provider JAR needs to be in the class path or module path.

Performance

Performance compared to NativePRNGNonBlocking is lower for small, single threaded workloads due to the syscall overhead and additionally negatively impacted by the meltdown patches. However for large or threaded workloads performance is higher.

Usage for Tomcat Session Ids

This security provider can be used for session id generation in Tomcat. In order for that several things need to be configured:

  1. the JAR needs to be added to the class path
  2. the .so should be added to the Java library path (java.library.path)
  3. the provider needs to be installed into the JVM via java.security.properties
  4. Tomcat needs to be configured to use the algorithm

Points 1, 2 and 3 can be configured in CATALINA_BASE/bin/setenv.sh

#!/bin/sh

CLASSPATH="/path/to/getrandom-provider-0.1.1.jar"
CATALINA_OPTS="$CATALINA_OPTS -Djava.library.path=/path/to/folder/with/so -Djava.security.properties=/path/to/jvm.java.security"

export CLASSPATH
export CATALINA_OPTS

Point can be configured on the Manager Component in conf/context.xml by setting secureRandomAlgorithm to geturandom

<Manager secureRandomAlgorithm="geturandom">
</Manager>

getrandom-provider's People

Contributors

marschall avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

getrandom-provider's Issues

Add badges

Add badges for Maven Central and Javadoc.

Consider GetByteArrayElements

For GCs that support object pinning like Shenandoah object pinning in the form of GetByteArrayElements and ReleaseByteArrayElements pairs may be worth considering for urandom reads as a copy can be avoided in this case. However for everybody else this would mean an allocation on the C heap which the current stack allocation scheme avoids.

Extract .so

Provide a way to extract the .so that people don't have to set the library path.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.