2012-04-21 9 views
5

estoy tratando de generar números aleatorios criptográficamente seguros usando Java y el uso de la sección de código siguiente para crear un objeto SecureRandom para ver su proveedor y el algoritmo:¿BouncyCastle tiene un servicio SecureRandom?

Provider prov=new org.spongycastle.jce.provider.BouncyCastleProvider(); 
Security.insertProviderAt(prov, 1); 

SecureRandom sr=new SecureRandom(); 
srProvider=sr.getProvider().toString(); 
srAlgorithm=sr.getAlgorithm(); 

(castillo esponjosa es equivalente castillo hinchable para android hecha por Roberto Tyley - https://github.com/rtyley)

Cuando veo imágenes proveedor y el algoritmo, se muestra: versión 1.0 Crypto SHA1PRNG

lo que me sorprende es que el proveedor no está Spongycastle incluso si está instalado como el primer proveedor en el código . Me gustaría preguntarle a) ¿No se implementó SecureRandom en Spongy Castle (o Bouncy Castle)? b) Por la "versión 1.0 Crypto" es exactamente (quiero decir es que el proveedor Sun JCE o qué?)

Gracias ...

Rubí

Respuesta

3

Suponiendo que se está ejecutando en Android (no lo hizo declarar esto explícitamente). Bouncy Castle no proporciona una implementación de SecureRandom. 'Crypto' es la armonía de Apache (en la que se basa la mayor parte del código Java central de Android) proveedor de JCE. No hay un código Sun JCE en Android. Por cierto, el proveedor 'Crypto' solo proporciona implementaciones SHA1PRNG (RNG), SHA-1 (hash) y SHA1withDSA (firma). Todo lo demás lo proporciona Bouncy Castle o el proveedor basado en OpenSSL.

Pregunta: ¿Por qué crees que necesitas una implementación de SecureRandom de Bouncy/Spongy Castle?

+0

Gracias Nikolay. Solo quería saber si SHA1PRNG tiene una alternativa o no. Sería bueno comprobar SHA1PRNG y otros en las herramientas de verificación de aleatoriedad. –

+0

Al menos en ICS (stock Galaxy Nexus) que es la única implementación de 'SecureRandom'. SHA1PRNG es un PRNG, por lo que solo es tan bueno como la semilla que le das. Y está sembrado de '/ dev/urandom', por lo que podría no ser tan bueno. De nuevo, esto es para ICS, pero dudo que sea diferente en otras versiones. '/ dev/random' puede ser muy lento en Android, así que supongo que es por eso que no se usa. Hazlo aquí si realmente consultas con una herramienta. –

+0

@ Nikolay Elenkov: Gracias por la información.¿Cómo puedo ver si dev/random o dev/urandom se usa en mi dispositivo Android como fuente de partida y cómo puedo cambiarlo dinámicamente en mi código? –

2

Castillo hinchable hace proporcionar un conjunto de generadores pseudo de números aleatorios (PRNGs). Hay muchos nombres para PRNG's; NIST los llama Deterministic Generadores de bits aleatorios (DRBG). Sin embargo, solo están disponibles en la API "Ligera" de Bouncy Castle, en el paquete org.bouncycastle.crypto.prng.

Sin embargo, Bouncy Castle es una implementación de software exclusivo de algoritmos criptográficos. Esto significa que no contiene una fuente para entropy. La entropía no puede ser generada solo por el software ya que los algoritmos de software son deterministas. Entonces, incluso si el proveedor de Bouncy Castle registrara algunos de los generadores en su proveedor "BC" (o el proveedor Spongy para Android) entonces aún tendría que depender de la misma fuente de entropía que la implementación de la plataforma SecureRandom.

Como la fuente de entropía es probablemente la culpable de la mayoría de los problemas de rendimiento, no debe esperar maravillas de Bouncy Castle con respecto a la eficiencia de generación de números aleatorios.

Actualmente (v1.54) el proveedor de Bouncy Castle no registra ninguna implementación de SecureRandom, así que ahí está.

+1

Parece que Bouncy Castle 1.57 está registrando una implementación de 'SecureRandom'. – martijno

Cuestiones relacionadas