module SecureRandom

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"

Public Class Methods

bytes(n) Show source
# File lib/securerandom.rb, line 54
def bytes(n)
  return gen_random(n)
end
gen_random(n) Show source
# File lib/securerandom.rb, line 58
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
        end
      end
      return gen_random(n)
    end
  else
    @rng_chooser.synchronize do
      class << self
        remove_method :gen_random
        alias gen_random gen_random_urandom
      end
    end
    return gen_random(n)
  end
end

Private Class Methods

gen_random_openssl(n) Show source
# File lib/securerandom.rb, line 87
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
Also aliased as: gen_random
gen_random_urandom(n) Show source
# File lib/securerandom.rb, line 102
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
Also aliased as: gen_random

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.