Estoy haciendo una aplicación que almacena documentos y le da a cada uno un UID basado en un resumen de SHA1 de algunas cosas, incluida la marca de tiempo. El resumen contiene muchos caracteres, y quiero permitir que los usuarios identifiquen los documentos utilizando los primeros x caracteres del resumen completo. ¿Cuál es un buen valor para x si la cantidad de documentos es aproximadamente de 10K a 100K?¿Cuánto puede truncar un hash SHA1 y estar razonablemente seguro de tener una ID única?
Respuesta
Adaptación de las fórmulas en el wikipedia for the Birthday problem, se puede aproximar la probabilidad de colisión como e^(-n^2/(2^(b+1)))
, donde n
es el recuento de documentos y b
es el número de bits. Graphing this formula with n=100,000, parece que querrá b> 45 al menos. Estaría más inclinado a ir con 64 para que sea un número agradable y redondo. Dicho esto, ¿tiene un plan para hacer frente a las colisiones si se producen (tal vez alterar la marca de tiempo ligeramente, o agregar un nonce?)
Para el caso, si el sha1 se basa en algo más que el contenido del documento, ¿por qué no simplemente convertirlo en una identificación aleatoria? En este caso, las colisiones son un problema menor, ya que siempre puedes generar un nuevo número aleatorio y volver a intentarlo (la probabilidad de una colisión con un solo intento es la misma).
Realmente no hay un valor para esto; Parte de lo que hace que SHA sea un buen algoritmo de hashing de propósito general es que datos similares no necesariamente producen valores hash similares. Su mejor opción (sin saber nada más sobre su sistema) sería simplemente buscar en la lista de documentos cuyos hashes comienzan con el valor proporcionado por el usuario, luego presentarlos con una lista de documentos para seleccionar o ir directamente al documento si solo hay uno
es eso lo que hace git con las revoluciones? – dan
@dan Lo es, y en general es un enfoque bastante bueno. –
Bueno, aquí hay un posiblemente demasiado simplista de una respuesta ..
Si con plena SHA1 se obtiene aproximadamente 1 de cada 2^160 posibilidades de colisión, a continuación, truncando un carácter a aumentar las probabilidades de colisión por 16 (todos los valores posibles del carácter truncado) ... que son 2^4 .. Entonces, si truncas x personajes obtienes 1 en 2^(160 - 4 * x) posibilidades de colisión ... ¿no?
Para un solo documento, esto es cierto, pero la probabilidad de que se produzca una colisión para cualquier par de documentos aumenta mucho más rápidamente – bdonlan
Biham/Chen ofrecen ejemplos de colisiones cercanas; y Knudsen demuestra Diferenciales truncados. Ambos son problemas para hashes truncados; tampoco son ejemplos de la paradoja del cumpleaños. – jww
Es un generalization de the birthday problem. En su caso n es el número de documentos, y en lugar de 365 constantes, tiene varias posibilidades que le da el límite (por lo que para k bits es 2 k).
Por supuesto, el cálculo exacto está descartado, pero puede usar approximation.
Biham/Chen ofrecen ejemplos de colisiones cercanas; y Knudsen demuestra Diferenciales truncados.Ambos son problemas para hashes truncados; tampoco son ejemplos de la paradoja del cumpleaños. – jww
Tenga cuidado con el truncamiento ya que no hay una reducción en la prueba de que el hash más pequeño es seguro. Vea Kelsey's http://csrc.nist.gov/groups/ST/hash/documents/Kelsey_Truncation.pdf. Kelsey da argumentos heurísticos que dicen lo mismo ("Salidas Hash Relacionadas" y "Colisiones Cercanas"). Biham/Chen ofrecen ejemplos de colisiones cercanas; y Knudsen demuestra Diferenciales truncados.
Al final, es probable que tipo de carga de datos en un HMAC con el tamaño truncada (el tamaño es digerido por el HMAC, también) y luego usar la truncada HMAC.
Hola JWW, sobre el NIST-PDF, ¿cómo lo interpretas? La fórmula de @ bdonlan, 'e^(- n^2/(2^(b + 1)))', ¿es una buena aproximación para estimar truncamientos o no? Si no es así, ¿cuál es la fórmula o algoritmo para verificar * el número mínimo de bits * (_bmin_) para un truncamiento SHA1? –
- 1. Hacer un sha1-hash de una fila en Oracle
- 2. Biblioteca hash MD5 y SHA1 C++
- 3. valores hash Almacenamiento SHA1 en MySQL
- 4. hash SHA1 en SQLite: ¿cómo?
- 5. Devolver sha1() hash desde couchdb
- 6. hash SHA1 en Delphi XE
- 7. ¿Cómo creo un hash SHA1 en ruby?
- 8. bash: truncar nombres de archivo, manteniéndolos única
- 9. ¿Puede un tbody estar dentro de otro?
- 10. ¿Es seguro usar System.currentTimeMillis() para generar una ID de base de datos única?
- 11. ¿Cuánto dura el hash SHA256?
- 12. ¿Está bien para usar solo 64 bits de sha1 hash como id?
- 13. ¿Por cuánto tiempo es seguro un canal TCP seguro y abierto?
- 14. ¿Cómo debo acceder al hash Boost SHA1?
- 15. Computadora única id
- 16. ¿cómo realizaría un hash SHA1 en un archivo?
- 17. ¿Cómo generar una ID de solicitud única en Rails?
- 18. hash SHA1 difieren entre openssl y hashlib/pycrypto
- 19. Generando una ID única en PHP
- 20. Extraiga el hash SHA1 de un archivo torrent
- 21. truncar el final de una cadena en I después de un personaje que puede estar presente cero o más veces
- 22. ¿SHA1 aún es seguro para usar como función hash en PBKDF2?
- 23. ¿Cómo generar hash aleatorio SHA1 para usar como ID en node.js?
- 24. Cómo usar el hash SHA1 en la programación C
- 25. Tener un ID de inicio de sesión y un ID de persona en SQL
- 26. ¿Puede un elemento tener una identificación y una clase?
- 27. Cómo generar una ID de sesión única en php
- 28. ¿Cómo puede una instrucción tener both = y ==?
- 29. Generar Hash SHA1 en la Biblioteca de clases portátil
- 30. SQL ¿Puedo tener una restricción "condicionalmente única" en una tabla?
Nit pequeño - ¿No es la formauala e^(- n^2/(2^(b + 1)))? Cambia la respuesta ligeramente a b> 40. – Fakrudeen
@Fakrudeen, de hecho, cometí un error al transcribirlo en la respuesta. Sin embargo, el gráfico fue correcto ... aunque ahora me doy cuenta de que stackoverflow no hizo un enlace: | – bdonlan
He actualizado la respuesta para tener la fórmula correcta según lo acordado en los comentarios. –