在 Bash 中创建密码

问题描述 投票:0回答:4

我当前正在生成一个密码,它是日期的哈希值。我想通过添加一些大写、小写、数字和特殊字符来提高生成的密码的安全性,所有字符的最小长度都为 10 个字符。

我目前拥有的如下。如您所见,它将输出分配给我的 PASSWORD 变量。

PASSWORD=$(date +%s | sha256sum | base64 | head -c 15)

我不确定是否可以内联执行此操作,或者是否需要在 bash 脚本中创建一个函数来适应?这可能吗?

提前非常感谢。

bash passwords
4个回答
16
投票

tr
head
:

password=$(tr -dc 'A-Za-z0-9!?%=' < /dev/urandom | head -c 10)

echo "$password"

输出(示例):

k?lmyif6aE

tr
通过 stdin 从 Linux 的特殊随机设备 /dev/urandom 读取字节,并删除除
A
Z
a
z
0
9
之外的所有字节/字符和
!?%=
tr
通过标准输出将其输出发送到
head
的标准输入。
head
在 10 个字节后剪切输出。


5
投票

或者您可以使用 openSSL rand 生成密码:

PASSWORD=$(openssl rand -base64 10)

例如,上述命令将在 base64 中生成 10 个字符的字符串。


1
投票

对 @Cyrus 的答案进行一些扩展,这是我在处理很多上下文中的大量密码后确定的替代版本:

# Generate a url safe password.
password() {
  local length=${1:-"10"}
  cat /dev/urandom | tr -dc A-Za-z0-9~_- | head -c $length && echo
}

这仅使用不需要进行 url 编码且易于选择和键入的字符,并且仍然具有大约 60 位的熵,这对于大多数用途来说已经足够了(我实际上使用默认长度 20,其中有 120一些熵,但我无法诚实地论证这对于安全来说是必要的)。

我还有以下内容:

# Generate a url safe password that:
# - begins with a letter, and has at least
# - one uppercase letter,
# - one lowercase letter,
# - one digit, and
# - one special character.
stupid_password() {
  while :
  do
    local pass=$(password "$1")
    [[ $pass != *[~_-]* ]] && continue
    [[ $pass != [A-Za-z]* ]] && continue
    [[ $pass != *[A-Z]* ]] && continue
    [[ $pass != *[a-z]* ]] && continue
    [[ $pass != *[0-9]* ]] && continue
    echo "$pass"
    break
  done
}

过滤过程效率低下,但基本上仍然是瞬时的。密码的安全性较低,但可以在未阅读 NIST 关于密码复杂性指南

的网站上使用

0
投票

这是一个基于 @Cyrus 的答案,具有更好的熵和一行中的多个密码:

for i in $(seq 1 5); do echo $(tr -dc 'A-Za-z0-9!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~' < /dev/urandom | head -c 20); done

它将生成五个20字节的密码。

egS<Fp]Y,G>fj@(z1TeB
i^B/juv$%,hJ.tSJzZ=(
te<I&9-/[Wq2,jjd[8fO
t6o"]vmV!arLowG*VCW,
zWiRZuH}q=PfX6Tk++>5
© www.soinside.com 2019 - 2024. All rights reserved.