Sé muy poco sobre Ruby, así que por favor, perdóneme si la respuesta es obvia. Noté en http://www.ruby-doc.org/stdlib-1.9.3/libdoc/securerandom/rdoc/SecureRandom.html que Ruby utiliza el pid y la hora actual para inicializar OpenSSL :: Random cuando se realiza una llamada a random_bytes. A menos que ocurra algo más bajo las sábanas, ¿no es esta la semilla que Netscape usó en su implementación inicial de SSL a mediados de los 90? http://en.wikipedia.org/wiki/Random_number_generator_attack#Prominent_examples_of_random_number_generator_security_issues¿La semilla de Ruby para OpenSSL :: Random es suficiente?
Surely Ruby no ha revivido un error de 18 años. ¿Que me estoy perdiendo aqui?
Editar: Aquí está la fuente para random_bytes. Observe la primera comprobación para ver si se compiló ruby con OpenSSL, en cuyo caso lo inicializa con el pid y la hora actual.
def self.random_bytes(n=nil)
n = n ? n.to_int : 16
if defined? OpenSSL::Random
@pid = 0 if !defined?(@pid)
pid = $$
if @pid != pid
now = Time.now
ary = [now.to_i, now.nsec, @pid, pid]
OpenSSL::Random.seed(ary.to_s)
@pid = pid
end
return OpenSSL::Random.random_bytes(n)
end
if !defined?(@has_urandom) || @has_urandom
flags = File::RDONLY
flags |= File::NONBLOCK if defined? File::NONBLOCK
flags |= File::NOCTTY if defined? File::NOCTTY
begin
File.open("/dev/urandom", flags) {|f|
unless f.stat.chardev?
raise Errno::ENOENT
end
@has_urandom = true
ret = f.readpartial(n)
if ret.length != n
raise NotImplementedError, "Unexpected partial read from random device: only #{ret.length} for #{n} bytes"
end
return ret
}
rescue Errno::ENOENT
@has_urandom = false
end
end
if !defined?(@has_win32)
begin
require 'Win32API'
crypt_acquire_context = Win32API.new("advapi32", "CryptAcquireContext", 'PPPII', 'L')
@crypt_gen_random = Win32API.new("advapi32", "CryptGenRandom", 'LIP', 'L')
hProvStr = " " * 4
prov_rsa_full = 1
crypt_verifycontext = 0xF0000000
if crypt_acquire_context.call(hProvStr, nil, nil, prov_rsa_full, crypt_verifycontext) == 0
raise SystemCallError, "CryptAcquireContext failed: #{lastWin32ErrorMessage}"
end
@hProv, = hProvStr.unpack('L')
@has_win32 = true
rescue LoadError
@has_win32 = false
end
end
if @has_win32
bytes = " ".force_encoding("ASCII-8BIT") * n
if @crypt_gen_random.call(@hProv, bytes.size, bytes) == 0
raise SystemCallError, "CryptGenRandom failed: #{lastWin32ErrorMessage}"
end
return bytes
end
raise NotImplementedError, "No random device"
end
No está muy bien documentado, ¿verdad? Sería educativo mirar más de cerca la fuente para ver qué hace OpenSSL con los valores proporcionados. Se supone que debe usar cualquier instalación aleatoria de nivel de sistema operativo disponible, como '/ dev/urandom' o'/dev/random' en lugar de algo así. – tadman
NO He encontrado algo de discusión sobre cómo la bifurcación puede provocar vulnerabilidades, lo que no es un buen augurio para la forma en que Ruby llama a OpenSSL. –
¿Podría indicarnos dónde dice que Ruby usa el pid y la hora actual como (solo) semillas? –