123456789_123456789_123456789_123456789_123456789_

Module: SecureRandom

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Defined in: lib/securerandom.rb

Overview

Secure random number generator interface.

This library is an interface to secure random number generators which are suitable for generating session keys in HTTP cookies, etc.

You can use this library in your application by requiring it:

require 'securerandom'

It supports the following secure random number generators:

  • openssl

  • /dev/urandom

  • Win32

Examples

Generate random hexadecimal strings:

require 'securerandom'

SecureRandom.hex(10) #=> "52750b30ffbc7de3b362"
SecureRandom.hex(10) #=> "92b15d6c8dc4beb5f559"
SecureRandom.hex(13) #=> "39b290146bea6ce975c37cfc23"

Generate random base64 strings:

SecureRandom.base64(10) #=> "EcmTPZwWRAozdA=="
SecureRandom.base64(10) #=> "KO1nIU+p9DKxGg=="
SecureRandom.base64(12) #=> "7kJSM/MzBJI+75j8"

Generate random binary strings:

SecureRandom.random_bytes(10) #=> "\016\t{\370g\310pbr\301"
SecureRandom.random_bytes(10) #=> "\323U\030TO\234\357\020\a\337"

Generate alphanumeric strings:

SecureRandom.alphanumeric(10) #=> "S8baxMJnPl"
SecureRandom.alphanumeric(10) #=> "aOxAg8BAJe"

Generate UUIDs:

SecureRandom.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594"
SecureRandom.uuid #=> "bad85eb9-0713-4da7-8d36-07a8e4b00eab"

Class Method Summary

::Random::Formatter - Extended

alphanumeric

SecureRandom.alphanumeric generates a random alphanumeric string.

base64

SecureRandom.base64 generates a random base64 string.

hex

SecureRandom.hex generates a random hexadecimal string.

random_bytes

SecureRandom.random_bytes generates a random binary string.

urlsafe_base64

SecureRandom.urlsafe_base64 generates a random URL-safe base64 string.

uuid

SecureRandom.uuid generates a random v4 UUID (Universally Unique IDentifier).

choose

SecureRandom.choose generates a string that randomly draws from a source array of characters.

gen_random

Class Method Details

.bytes(n)

[ GitHub ]

  
# File 'lib/securerandom.rb', line 55

def bytes(n)
  return gen_random(n)
end

.gen_random(n)

[ GitHub ]

  
# File 'lib/securerandom.rb', line 59

def gen_random(n)
  ret = Random.urandom(1)
  if ret.nil?
    begin
      require 'openssl'
    rescue NoMethodError
      raise NotImplementedError, "No random device"
    else
      @rng_chooser.synchronize do
        class << self
          remove_method :gen_random
          alias gen_random gen_random_openssl
          public :gen_random
        end
      end
      return gen_random(n)
    end
  else
    @rng_chooser.synchronize do
      class << self
        remove_method :gen_random
        alias gen_random gen_random_urandom
        public :gen_random
      end
    end
    return gen_random(n)
  end
end

.gen_random_openssl(n) (private)

[ GitHub ]

  
# File 'lib/securerandom.rb', line 90

def gen_random_openssl(n)
  @pid = 0 unless defined?(@pid)
  pid = $$
  unless @pid == pid
    now = Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond)
    OpenSSL::Random.random_add([now, @pid, pid].join(""), 0.0)
    seed = Random.urandom(16)
    if (seed)
      OpenSSL::Random.random_add(seed, 16)
    end
    @pid = pid
  end
  return OpenSSL::Random.random_bytes(n)
end

.gen_random_urandom(n) (private)

[ GitHub ]

  
# File 'lib/securerandom.rb', line 105

def gen_random_urandom(n)
  ret = Random.urandom(n)
  unless ret
    raise NotImplementedError, "No random device"
  end
  unless ret.length == n
    raise NotImplementedError, "Unexpected partial read from random device: only #{ret.length} for #{n} bytes"
  end
  ret
end