如何在bash脚本中通过输入两次密码来安全确认密码

7
我希望创建一个Bash脚本,用户可以选择用户名、密码,并通过两次输入来确认密码。如果密码不匹配,应提示用户重新输入。如果密码匹配,则脚本应创建一个密码哈希值;否则一直要求输入,直到正确为止。
到目前为止,我有以下代码,但我不确定这是否是正确的做法。 以下Bash脚本是否存在问题?
# read username
read -p "Username: " username

# read password twice
read -s -p "Password: " password
echo 
read -s -p "Password (again): " password2

# check if passwords match and if not ask again
while [ "$password" != "$password2" ];
do
    echo 
    echo "Please try again"
    read -s -p "Password: " password
    echo
    read -s -p "Password (again): " password2
done

# create passwordhash
passwordhash=`openssl passwd -1 $password`

# do something with the user and passwordhash

脚本的问题在于你不理解它的工作原理。 - hek2mgl
在你的问题中,你写道“我找到了一个可以正常工作的解决方案,但我不确定这是否是正确的做法。”只有这些信息我的评论才有意义。似乎是一个误解。我已经编辑过了并给了你一个赞。 - hek2mgl
顺便说一句,当输入密码时,我会禁用终端输出。请查看此链接 - hek2mgl
1
@hek2mgl 对于误解我应该选择更好的措辞表示歉意。感谢您提供终端输出提示,现在我在密码输入之前使用 stty -echo,并在之后使用 stty echo - Passuf
@klashxx的答案连同stty的内容看起来是一个不错的解决方案。然而,我会立即用它的哈希值覆盖$password,以便尽快将明文密码从内存中清除。 - hek2mgl
显示剩余2条评论
2个回答

17
减少冗长的一种方法:
#!/bin/bash
   
read -p "Username: " username
while true; do
  read -s -p "Password: " password
  echo
  read -s -p "Password (again): " password2
  echo
  [ "$password" = "$password2" ] && break
  echo "Please try again"
done

谢谢您的回答。我也这样做了,但问题在于如果密码匹配,“请重试”消息仍会被回显。 - Passuf
@Passuf,当if条件为false时,您可以使用||来触发echo语句:[ "$password" = "$password2" ] && break || echo "请再试一次" - fabianegli

0
不要忘记使用continue,这样while循环就会在两个不同的密码上重新开始。
while [ -z "$password" ]; do
  echo "Please enter a password: "
  read -s first
  read -s -p "Retype a password: " second
  if [ $first == $second ];
  then
    password=$first
    echo "Both passwords are the same. Continuing.."
  else
    echo "You have entered different passwords. Try again.."
    continue
  fi
  break
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接