WhatsApp ha anunciado recientemente el cifrado de extremo a extremo en todas las comunicaciones. Si bien es un movimiento impresionante, todavía tengo un gran signo de interrogación abierto.
Los artículos y este documento técnico sugieren que la clave pública, una vez generada, se almacena en el servidor Cuando quiero hablar con otra persona, le pido al servidor de WhatsApp su clave pública y la uso para comunicarme. Ese mismo libro blanco dice esto acerca de la verificación clave:
Usuarios de WhatsApp Adicionalmente tenemos la opción de verificar las claves de los demás usuarios. Con quién se están comunicando para que puedan confirmar que un tercero no autorizado (o WhatsApp) no ha iniciado una El hombre en el ataque medio. Esto se puede hacer escaneando un código QR, o comparando un número de 60 dígitos.
Oh, eso está bien, ¿cómo se generan esas cosas?
El código QR contiene:
- Una versión.
- El identificador de usuario para ambas partes.
- La clave de identidad pública de 32 bytes completa para ambas partes.
Cuando cualquiera de los usuarios escanea el código QR del otro, las claves se comparan para garantizar que lo que está en el código QR coincide con la clave de identidad como se recupera de la servidor.
Pero ... esos son todos los detalles que el servidor conoce, y no requiere nada especial de la otra persona (no menciona que se haya firmado el QR). ¿Qué tal el número de 60 dígitos?
El número de 60 dígitos se calcula al concatenar los dos dígitos de 30 dígitos. huellas dactilares numéricas para la clave de identidad de cada usuario. Para calcular un Huella digital numérica de 30 dígitos:
- iteradamente SHA-512 hash la clave de identidad pública y el identificador de usuario 5200 veces.
- Tome los primeros 30 bytes de la salida de hash final.
- Divida el resultado de 30 bytes en seis porciones de 5 bytes.
- Convierta cada fragmento de 5 bytes en 5 dígitos interpretando cada fragmento de 5 bytes como un entero sin signo big-endian y reduciéndolo a módulo 100000.
- Concatene los seis grupos de cinco dígitos en treinta dígitos.
Nuevamente, esos son detalles que el servidor puede calcular y presentar fácilmente como datos de verificación válidos.
¿Lo estoy entendiendo mal o no hay una manera real de verificar que la clave pública con la que estoy hablando pertenece a la persona que creo que es?