SHA-1 Pseudo-Random Number Generation es un algoritmo de generación de números seudoaleatorios utilizados por SHA-1. Este algoritmo viene implementado desde la versión 1.1 del JDK de Sun Microsystems como un API aparte, y desde la versión 1.4 viene ya integrado al J2SE.
Ejemplo de uso
SecureRandom _random; MessageDigest _digest; byte[] _salt; public HashPass() throws NoSuchAlgorithmException { _random = SecureRandom.getInstance("SHA1PRNG"); _digest = MessageDigest.getInstance("SHA-1"); _salt = new byte[2]; } public String getSaltString() { synchronized (_random) { _random.nextBytes(_salt); } return toHexString(_salt); } public String getSaltString(String hashedString) { return hashedString.substring(hashedString.length() - 4); } public String passWord(String pass, String salt) { String pw = pass + salt; byte[] hash = null; synchronized (_digest) { _digest.reset(); _digest.update(pw.getBytes()); hash = _digest.digest(); } return toHexString(hash) + salt; } private static String toHexString(byte[] texto) { StringBuffer ret = new StringBuffer(); String temp = Hex.getByteToHex(texto); for (int i = 0; i < temp.length(); i++) if (temp.charAt(i) != ' ' && temp.charAt(i) != '\n') ret.append(temp.charAt(i)); return ret.toString(); }
Comparando ColdFusion Número de aleatorización Algoritmos
La otra semana, he publicado acerca de cómo no me siento como ColdFusion siempre hizo un gran trabajo de generación de números aleatorios. Cuando se utiliza el método de ColdFusion randrange (), acabo de pasar en los dos enteros requeridos. Después de publicar esto, Dustin me dijo que ColdFusion MX7 introdujo un tercer argumento para el método randrange (), que fue el algoritmo por el cual se generaron los números aleatorios. De forma predeterminada, ColdFusion utiliza el algoritmo CFMX_COMPAT. Al parecer (y así se haga constar directamente en la documentación ), el algoritmo alternativo, SHA1PRNG, va a hacer un trabajo mucho mejor de la aleatorización de números.Para explorar estos dos algoritmos, yo primero quería empezar graficando ellos, para ver si podía ver las tendencias obvias. En el siguiente ejemplo, estoy en bucle durante los dos algoritmos y luego utilizando la etiqueta cfchart de ColdFusion para cargar 50 números al azar entre los valores 1 y 50.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 <! ---Loop largo de los dos algoritmos, el valor predeterminadoCFMX_COMPAT y luego el SHA1PRNG. Somosva a trazar algunos números al azar para verlo que parecen.--->< cfloopÍndice = " strAlgorithm "lista = " CFMX_COMPAT, SHA1PRNG "delimitadores = " , " ><! ---Crear un gráfico de líneas de esta forma aleatorianúmeros seleccionados.--->< cfchartformato = " png "chartheight = " 500 "chartwidth = " 545 "formatoetiqueta = " número "xaxistitle = " iteración "yaxistitle = " Random Number " >< cfchartseries tipo = " línea " ><! ---Crear cada elemento de datos mediante la generación al azarun número usando uno de los algoritmos.--->< cfloopÍndice = " intI "de = " 1 "a = " 50 "paso = " 1 " >< cfchartdataelemento = " # intI # "valor = " # randrange ( 1 , 50 , strAlgorithm ) # "/></ cfloop ></ cfchartseries ></ cfchart ></ cfloop >Desde el código anterior, obtenemos los siguientes gráficos:Algoritmo: CFMX_COMPAT (de ColdFusion Default)
Algoritmo: SHA1PRNG (Añadido en ColdFusion MX7)
Ahora, me veo en estos dos gráficos, y francamente, no quiero decir nada para mí. No veo tendencias, e incluso si me veo algunas tendencias, que no entiendo el significado. Ambos de estos gráficos se ven como un buen conjunto aleatorio de números.
Pero más que eso, esto no es un caso de prueba útil para mí. Mis problemas con aleatoriedad rara vez implican la generación de una tonelada de números de la derecha en una fila; mis escenarios generalmente implican actualizar manualmente una página para ver si algo está girando "correctamente" (piensa en los anuncios o imágenes de cabecera). En ese caso, hay un gran retardo entre la generación de números al azar (comparado el retardo entre iteraciones cfloop). En mi próximo experimento, estoy utilizando una actualización de etiquetas META para poner un retardo uniforme entre mi página se actualiza, ya que esto imitar más de cerca me sienta allí y golpear el botón de actualización del navegador:
1234567891011121314151617181920212223242526272829303132333435363738394041 |
|
Corrí el código anterior tres veces para cada algoritmo y aquí están las listas de números que se generaron:
Algoritmo: CFMX_COMPAT (de ColdFusion Default)
- 9,7,7,7,7,7,7,6,6,6,6,9,9,8,9,8,8,8,8,8
- 3,6,6,6,5,6,6,5,5,4,4,5,2,3,2,2,2,2,2,2
- 5,8,8,7,7,6,7,7,6,6,9,10,9,9,8,8,9,8,8,8
Algoritmo: SHA1PRNG (Añadido en ColdFusion MX7)
- 6,8,9,6,4,5,5,9,8,4,10,5,7,4,4,8,10,2,6,1
- 6,6,8,9,8,1,8,9,9,3,7,3,3,5,6,7,7,3,4,5
- 4,8,2,8,4,1,4,4,3,3,9,10,2,10,6,6,4,4,5,2
La sola observación de estos números, puedo ver claramente la agrupación en el algoritmo CFMX_COMPAT. Hay algo de agrupación en el algoritmo de SHA1PRNG, pero en un grado mucho mucho menor. No sé cómo el calendario de la generación de números aleatorios afecta a las cosas, pero que parece tener algún tipo de vínculo con la naturaleza aparentemente efectiva del documento final. Ahora, digo "aparentemente" porque, recuerda, estoy realmente más preocupado por una distribución equitativa de los números y en menor medida de la asignación al azar real de los números. La asignación al azar o no, el SHA1PRNG parece tener una mejor distribución de los números.
No hay comentarios:
Publicar un comentario