En general, se sabe que los métodos como el método array_rand()
en PHP no se consideran criptográficamente seguros. Estoy tratando de entender en qué situaciones el resultado generado puede ser predecible.
Si conozco la semilla, los valores en la matriz, un solo valor generado y cuántas veces se ha llamado al método antes de que se generara ese valor, sé que puedo calcular fácilmente todos los valores devueltos posteriormente. Puedo hacerlo escribiendo mi propio script que usa la misma semilla y genera el mismo número de resultados, por lo tanto, poniéndolo en el mismo estado.
Suponiendo que no conozco la semilla o el número de valores generados previamente, ¿cuáles son mis posibilidades / qué tan bajo puedo obtener la probabilidad de predecir valores futuros?
Para definir un ejemplo más concreto y hacer que la pregunta sea menos teórica, supongamos que estamos usando array_rand
para generar tokens alfanuméricos que no distinguen entre mayúsculas y minúsculas con una longitud de 12. Esto se hace capturando 12 valores de una matriz de caracteres llamando a array_rand 12 veces, haciendo el token [A-Z\d]{12}
. Sé que tengo uno de los mil tokens generados consecutivamente, pero no en qué posición se generó.
¿Puedo predecir el siguiente token (suponiendo que no se haya generado el último token)? Supongo que esto no se puede predecir con una precisión del 100%, pero ¿cuáles son las posibilidades de que Brute fuerce todas las posibilidades para el siguiente token y cuántos serían?
Suponiendo que puedo validar si un token es válido, ¿de qué manera saber 2 tokens consecutivos (24 valores) reduce mis posibilidades de predecir el tercero, etc.
He visto un poco de investigación sobre cómo descifrar el estado de rand
, pero los artículos generalmente no tratan con rangos restringidos / truncados.
P.S. Estoy tratando de entender la prueba / matemática detrás de por qué es inseguro, no busco sugerencias de enfoques más seguros.