Uso de PGP para responder preguntas de seguridad de la cuenta con PKI

1

Las preguntas de seguridad son bien conocidas / ampliamente consideradas para disminuir la seguridad o crear otros problemas (por ejemplo, recordar las malas palabras), pero a veces se me exige que las responda y las responda. Si bien eso se ha discutido muchas veces antes, así que no voy a repetir el debate aquí, soy un fanático de las contraseñas que son seguras y pueden ser (re) generadas fácilmente, así que lo que me gustaría hacer es responder a preguntas de seguridad con una parte de mi firma pgp para las preguntas en sí. Sin embargo, esto me deja con dos problemas de los que no estoy seguro:

  1. si me falta algo que pueda hacer que esto sea menos seguro o menos reproducible (diferentes versiones de gpg o algoritmos predeterminados, etc.) de lo que podría pensar que es, y
  2. desde donde se extrae la porción de la firma, considerando algo como el encabezado pgp y el hecho de que la firma completa es demasiado larga para usar de manera realista.

Actualmente, si uso echo -n 'What is the air speed velocity of an unladen swallow?' | gpg -s --clearsign , obtengo:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

What is the air speed velocity of an unladen swallow?
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQIcBAEBAgAGBQJaUnsoAAoJEAsnyIE5nAz6NLQP/2Yb33we/32eyWhHoCcYpzQI
0Si5AD+BJCrpcKgAehKdkx/eaHPKfTX55cxT23qk14XiLwnDqSsK/oPazuUwUIoP
brWkgqXj2G2YhQkBKe/WaEafbi3J7kmeddrmpaFrAkKkYYdFcC8zXtH9YcpM5OB2
kMava8oO0K6exoY4r2Fa9mIiOHrFZXkbtY9NuOvxhhOLmAeQolJ7WBdc+mt/Pmwv
0YIWlJhLgxxqqtXTlHXNNbatqkClAE1DB48FyyP3Mi8P8Ny+3z6ntDtwZezF+Lc4
67hWsUzjZ24E4Ww0CLquFTomNscuTFJRnAKJE02ctDixuz17zZxaliQBXdTrA43k
OUr+d9P2OdJXNPA0H9GQV9T+6CrHXM3dRXzrpSTrXzg7ZM8EWDB2b9iPp5b60KmE
/IwG0ijWH3B90gXJeGW2KeUm8qhH6AYBeXG+Yv2+9tB6T7KYETMku+FKgh61O6MJ
hYnQ7YMRhf8WjZw6m+jZ3knn0tIYqwszlJ7nJ0qlYlMsY9YzJkvKTpGQLHxQqDJv
ZraIbgPJuPJ1uT+qbbWk+QgOpehAyAFC/3aI57eqI/3poKl2/2f3QMsw7yRPnN/s
HeIvXhEVBqcOb7pfI3i6pT9f01QG5u16/vAKf6pq9WOuVTCeH5CP0t0xZ3eF+kJ+
m4C4rL/Q+uSexZL9IQ07
=jh/a
-----END PGP SIGNATURE-----

Lo que me gustaría hacer es tomar tal vez un fragmento de la firma de 16 caracteres para usar como mi respuesta que estaría en una ubicación consistente y fácil de encontrar, de modo que pueda reproducir de manera confiable mis respuestas a todas las preguntas de seguridad futuras, pero ¿Dónde debería estar eso? Al menos los primeros 18 caracteres parecen ser los mismos independientemente de la entrada, pero eso solo no es suficiente para convencerme de que simplemente deseche los primeros 18 y use los siguientes 16.

¿Alguien puede abordar las dos preocupaciones anteriores?

ACTUALIZAR

Esta pregunta originalmente se basaba más en la percepción de PGP como la solución potencial a mi problema, que se demostró que no era adecuada para el requisito de reproducibilidad. Sin embargo, todavía me gusta la idea de tratar preguntas de seguridad similares a la autenticación de desafío-respuesta con los beneficios de seguridad que generalmente se obtienen a través de los enfoques PKI (por ejemplo, verificabilidad, no repudio, etc.). En ausencia de tal solución, HMAC puede ser una alternativa viable, pero se reduce a ser más que una simple contraseña (algo que sé) en lugar de una respuesta verificable públicamente basada en algo vinculado a mi identidad como una clave (algo que tengo). ). Si bien esta no es una pregunta del AMF, me gustaría saber si hay algún otro enfoque posible que pueda acercarme más a lo que había imaginado.

    
pregunta Hiko Haieto 07.01.2018 - 21:15
fuente

2 respuestas

1

El formato de una firma PGP es un mensaje codificado en base 64 que contiene varios campos, muchos de los cuales son fijos o predecibles. (por ejemplo, identificadores de clave, algoritmos en uso, campos de longitud, etc.) Además, las firmas contienen marcas de tiempo, por lo que si regenera una firma, no se garantiza que obtenga los mismos valores. Las firmas PGP no son deterministas, por lo que no son adecuadas para su caso de uso.

Si quieres hacer algo como esto, usaría un HMAC con un solo secreto para generar la respuesta. Sin embargo, si hace eso, dos sitios con la misma pregunta de seguridad obtienen la misma respuesta. (No es peor que su propuesta original, ni la implementación tradicional de preguntas de seguridad, solo una nota).

Puedes hacer algo como lo siguiente en python:

import hmac
print hmac.HMAC('secretkey', 'What is the air speed velocity of an unladen swallow?').hexdigest()

Lo que da 0e348e81ee5460ef138f7ec3ac9431de como resultado. Sin secretkey , un atacante no podría reproducir esto. Obviamente, puedes envolver esto en un pequeño script para que sea más fácil de usar.

OTOH, la solución común a este problema es almacenar las respuestas en un administrador de contraseñas. Solía usar respuestas más bien profanas (más o menos no relacionadas con la pregunta) para las preguntas de seguridad. Me detuve después de la primera vez que llamé a un banco y querían que la respuesta que configuré en línea les respondiera por teléfono.

    
respondido por el David 07.01.2018 - 21:34
fuente
1

Hay mucho que hacer con las firmas de GPG; Absolutamente NO los usaría para este propósito.

Como mencionó @David, un HMAC es una forma razonable de manejar esto; openssl desde la línea de comandos puede hacerlo; Sugeriría que openssl es una alternativa razonable a gpg.

echo -n 'What is the air speed velocity of an unladen swallow?' | openssl dgst -sha512 -hmac MyKeyForAll

da, para mi

  4e423843133900407cab86527c7f17cd231cfa51a8bd21fdd8ff99aca2af19b9bbbc46c331326f712c25fab244ec5827d6430d5939c054b407010f1a470f9696

y usted también debería, en cualquier computadora, en cualquier software compatible con RFC 2104 que admite HMAC-SHA-512 (Suponiendo que la codificación de bytes sea idéntica).

Al cambiar la contraseña o la clave, el resultado cambia dramáticamente.

Un método superior es PBKDF2 u otra técnica correctamente iterada; PBKDF2, en particular, se basa en iterar correctamente un HMAC!

En mi repositorio de Github tengo varias implementaciones de PBKDF2 que se ejecutan tanto en Windows como en Linux (en varios idiomas y con varias bibliotecas).

En estos ejemplos, puedes aumentar el número de iteraciones para forzar a un atacante a que haga un mayor esfuerzo en cada uno de sus intentos. Por ejemplo:

  pbkdf2 -a SHA-512 -p "What is the air speed velocity of an unladen swallow?" -s MyKeyForAll -i 1310720 -o 64

toma aproximadamente 2 segundos en mi computadora portátil usando mi ejecutable basado en OpenSSL, y genera

  b45dc81933b8221ac69785f867e1ddedf6954e99f14a28bf41bd2f5f5f590e589f6b3b9f129c9cc9863deb412872fd8137478c729b5c01f5ac258699c0d5b141

igual que todas las demás implementaciones válidas de PBKDF2-HMAC-SHA-512 (en cantidades variables de tiempo, tanto PolarSSL como CSharp tardarán aproximadamente 3 veces más).

Si juegas un poco con cualquiera de los códigos fuente, puedes obtener la capacidad de generar Base64 si lo deseas.

En todos los casos, la contraseña o la clave / sal DEBEN ser una cadena aleatoria larga.

Una opción aún más superior es usar algo como Keepass para generar contraseñas aleatorias largas para cada necesidad que tengas , y haga que los copie / pegue / autografíe para usted.

    
respondido por el Anti-weakpasswords 08.01.2018 - 07:44
fuente