【问题标题】:TOTP creating using bash and HMAC使用 bash 和 HMAC 创建 TOTP
【发布时间】:2019-02-24 01:59:19
【问题描述】:

我正在尝试编写一个生成 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")

我做错了什么?

【问题讨论】:

  • 如果某些答案对您有帮助,请考虑accepting it。这将为您和回答者带来声誉。也可以通过tour 了解更多它是如何工作的

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


【解决方案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"

【讨论】:

  • 谢谢,现在可以使用了。但是,我在不同的机器上运行得到不同的结果可能是什么原因?机器 1 echo $BASH_VERSION 4.3.48(1)-release 机器 2 echo $BASH_VERSION 4.4.12(1)-release
  • 值在哪一行开始分歧?
  • 没关系 2 台机器是在不同的时区配置的,现在效果很好,非常感谢
  • 您可以使用date -u 始终在运行脚本的任何地方获取UTC 时间
猜你喜欢
  • 1970-01-01
  • 2017-01-31
  • 2013-11-26
  • 1970-01-01
  • 2022-08-19
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
相关资源
最近更新 更多