我在这里没有专门解决有关 Yubikey with Password Safe 目的的任何原始问题,但我认为我进行的实验可以对这种情况有所了解。
我已经确认@Kousha 是正确的:Yubikey 响应只是变成了静态密码。
如下所述进行验证。(我想提供以下代码来帮助Source Forge 上 Password Safe的发帖人,但我没有这样做的帐户。)
来自密钥的密码安全 Yubikey 响应
可以使用 HMAC-SHA1 和 Yubikey 的密钥以直接的方式生成 Yubikey 响应,但是由于空字符和操作系统不兼容,生成密码安全 Yubikey 响应有点复杂。(本质上,必须在挑战中的每个原始字节之间插入一个空字节。)此外,Yubikey 挑战会被解析。简而言之,在 Linux 计算机上,如果key
以 40 位十六进制形式存储 Secret Key 并message
存储挑战,则以下命令应返回 Password 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
如果可能,您可能想在 Yubikey 上写入一个临时密钥,并使用您的真实密码以外的挑战进行验证——我不熟悉计算机如何存储变量或其他相关的安全问题。(如果有人对此有所了解,我很乐意学习。)您至少可以使用stty
. 以下脚本提示输入密钥和质询而不显示它们,然后输出密码哈希 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
我无法证明上述命令和上述脚本的可移植性。至少,它们是对我有用的东西的精简版本。