No resuelvo específicamente ninguna de las preguntas originales aquí relacionadas con el propósito de Yubikey con Password Safe, pero creo que el experimento que realicé puede arrojar algo de luz sobre la situación.
He confirmado que @Kousha es correcta: la respuesta de Yubikey simplemente se convierte en la contraseña estática.
Verifique como se describe a continuación. (Quería proporcionar el siguiente código para ayudar al póster en Password Safe en Source Forge , pero no tengo una cuenta para hacerlo.)
Respuestas de contraseña seguras de Yubikey desde la clave secreta
Una respuesta de Yubikey se puede generar de manera directa con HMAC-SHA1 y la clave secreta de Yubikey, pero generar la respuesta de Contraseña segura de Yubikey es un poco más complicado debido a los caracteres nulos y las incompatibilidades del sistema operativo. (Esencialmente, uno tiene que insertar un byte nulo entre cada byte original en el desafío). Además, los desafíos de Yubikey obtienen analizado . En resumen, en una computadora con Linux, si key
almacena la clave secreta en forma hexadecimal con 40 hexits y message
almacena el desafío, el siguiente comando debe devolver la respuesta de Safe Safe Yubikey:
printf $message |
xxd -p | sed 's/../&00/g' |
sed 's/00$//' | cut -c -63 | xxd -r -p |
openssl dgst -sha1 -mac HMAC -macopt "hexkey:$key" -binary |
xxd -p
Si es posible, puede escribir una clave secreta temporal en el Yubikey y usar un desafío que no sea su contraseña real para la verificación. No estoy familiarizado con la forma en que las computadoras almacenan las variables u otros problemas de seguridad relacionados. (Me encantaría saber si alguien tiene conocimiento de esto). Al menos podría ocultar los caracteres escritos con stty
. La siguiente secuencia de comandos solicita la clave secreta y el desafío sin mostrarlos, y luego envía la respuesta de contraseña Hash Yubikey.
#!/usr/bin/env bash
stty -echo
printf "shared secret key (40 hexits): "
read HMACSHA1_key
if [ -z "$HMACSHA1_key" ]; then
stty echo
printf '\n Empty input. Exiting.\n'
exit 1
fi
if [ ${#HMACSHA1_key} -ne 40 ]; then
stty echo
printf '\n Need exactly 40 characters. Exiting.\n'
exit 1
fi
HMACSHA1_no_space="${HMACSHA1_key/ /}"
if [ ${#HMACSHA1_no_space} -ne 40 ]; then
stty echo
printf '\n No spaces. Exiting.\n'
exit 1
fi
HMACSHA1_key_mod_hex=$(printf "$HMACSHA1_key" | sed 's/\([0-9]\|[a-f]\|[A-F]\)//g')
if [ -n "${HMACSHA1_key_mod_hex}" ]; then
stty echo
printf '\n Invalid characters: %s\n' "${HMACSHA1_key_mod_hex}"
printf '\n Only 0-9, a-f, A-F allowed. Exiting.\n'
exit 1
fi
printf "\n"
printf "message/challenge: "
read HMACSHA1_value
if [ -z "$HMACSHA1_value" ]; then
stty echo
printf '\n Empty input. Exiting.\n'
exit 1
fi
printf $HMACSHA1_value |
xxd -p | sed 's/../&00/g' |
sed 's/00$//' | cut -c -63 | xxd -r -p |
openssl dgst -sha1 -mac HMAC -macopt "hexkey:$HMACSHA1_key" -binary |
xxd -p
No puedo dar fe de la portabilidad del comando anterior y la secuencia de comandos anterior. Son versiones reducidas de las cosas que me funcionaron, al menos.