使用bash和HMAC创建TOTP

时间:2018-09-19 20:13:52

标签: linux bash hash modulo one-time-password

我正在尝试编写一个生成6位TOTP的bash代码。我写了以下代码:

##!/bin/bash
T=`date '+%Y%m%d%H%M'`
K="secret"
prefix="(stdin)= "
keyhex=$(echo -n $T | openssl dgst -sha1 -hmac $K | sed -e "s/^$prefix//")
dec=$((echo $(( 16#$keyhex )) ))
key=$((echo $(($dec % 1000000))))
echo $key

有时可以正常工作,有时会出现以下错误:

./auth.sh: line 6: echo 4076818289415231324 : syntax error in expression (error token is "4076818289415231324 ")
./auth.sh: line 7: % 1000000: syntax error: operand expected (error token is "% 1000000")

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

您正在尝试使用$((arithmetic expansion))的地方使用$(command substitution)

代替

dec=$((echo $(( 16#$keyhex )) ))

使用

dec=$(echo $(( 16#$keyhex )) )

甚至更好,只是

dec=$(( 16#$keyhex ))

以下是您的脚本以及其他一些调整:

#!/bin/bash
T=$(date '+%Y%m%d%H%M')
K="secret"
prefix="(stdin)= "
keyhex=$(printf '%s' "$K" | openssl dgst -sha1 -hmac $K | sed -e "s/^$prefix//")
dec=$(( 16#$keyhex ))
key=$((dec % 1000000))
echo "$key"