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' p SecureRandom.hex(10) #=> "52750b30ffbc7de3b362" p SecureRandom.hex(10) #=> "92b15d6c8dc4beb5f559" p SecureRandom.hex(13) #=> "39b290146bea6ce975c37cfc23"
Generate random base64 strings:
p SecureRandom.base64(10) #=> "EcmTPZwWRAozdA==" p SecureRandom.base64(10) #=> "KO1nIU+p9DKxGg==" p SecureRandom.base64(12) #=> "7kJSM/MzBJI+75j8"
Generate random binary strings:
p SecureRandom.random_bytes(10) #=> "\016\t{\370g\310pbr\301" p SecureRandom.random_bytes(10) #=> "\323U\030TO\234\357\020\a\337"
Generate UUIDs:
p SecureRandom.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594" p SecureRandom.uuid #=> "bad85eb9-0713-4da7-8d36-07a8e4b00eab"
Public Class Methods
bytes(n)
click to toggle source
# File lib/securerandom.rb, line 48 def bytes(n) return gen_random(n) end
gen_random(n)
click to toggle source
# File lib/securerandom.rb, line 52 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
Private Class Methods
gen_random_openssl(n)
click to toggle source
# File lib/securerandom.rb, line 83 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)
click to toggle source
# File lib/securerandom.rb, line 98 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