🔐密码瞬间生成!创造✨好记又好用✨的超强密码!

9,915 阅读6分钟

介绍

密码生成的重要性和挑战性

在当今数字化时代,密码的重要性无可置疑。我们使用密码来保护个人隐私、安全存储敏感信息,甚至登录各种在线账户和应用程序。然而,创建一个既安全又容易记住的密码并不容易。

本文将揭示的密码生成的秘籍

幸运的是,我们为您揭示一个密码生成的秘籍,帮助您瞬间生成好记又好用的超强密码!通过本文提供的方法,您将能够创建既满足安全性要求又容易记住的密码,摆脱繁琐的密码管理。

本文将介绍一种基于牛津 3000 单词列表和 Leetspeak 替换规则的密码生成策略。我们将逐步讲解如何从单词列表中选择单词构成明文密码,并应用 Leetspeak 替换规则转换为符合安全要求的密码。同时,我们将引入检查密码符合要求的方法,确保生成的密码包含大小写字母、数字和特殊符号。

现在,让我们一起揭示这个密码生成的秘籍,让您能够轻松生成安全且易记的超强密码,保护您的个人信息和账户安全!

需求分析

在设计和生成密码的过程中,我们希望平衡这两个主要的要素:好记和健壮。

  1. 好记 memorable:一个好记的密码意味着它容易被用户记住,而不需要写下来或者用密码管理器来保存。为了使密码更好记,可以采用诸如短语或者是一些相关单词的组合,比如:使用的牛津 3000 单词的方式。这种方法可以生成容易记忆的密码,因为它们是由实际的、有意义的单词组成的。
  2. 健壮 robust:一个健壮的密码应该足够复杂,以防止被猜测或者暴力破解。这通常意味着密码应该足够长,并且包含各种字符,如大写和小写字母、数字和符号。比如:使用 Leetspeak 规则和随机选择符号来提高密码的健壮性。

然而,好记和健壮往往是相互冲突的:一个非常健壮的密码可能很难记住,而一个容易记住的密码可能不够健壮。这就是为什么在设计密码生成策略时,需要在这两个要素之间找到一个平衡点。

解决方案

  • 由三个常见小写英文单词构成,单词长度在 4—6 个字母之间,之间用连字符 - 连接。这样,所得密码的长度在 14 到 20 字符之间,符合常见强密码要求。
  • 将单词中的部分字母替换为大写。
  • 将单词中的部分字母替换为形态类似的数字(例如 a 换为 4e 换为 3o 换为 0 等,即早年 BBS 文化中称为 leetspeak 的做法)。
  • 将单词中的部分字母替换为形态类似的特殊符号(例如 a 换为 @l 换为 !s 换为 $ 等)。

逻辑梳理

  1. 检查牛津 3000 单词列表文件是否存在,如果不存在则下载。
  2. 接收用户传入的单词个数参数,如果未传入则默认为 3。
  3. 从牛津 3000 单词列表中随机选择指定个数的单词,构成明文密码。
  4. 将明文密码进行 Leetspeak 替换,生成密码。检查生成的密码是否符合要求,即必须包含大小写字母、数字和特殊符号。
  5. 如果生成的密码不符合要求,则重新生成密码,直到符合要求为止。
  6. 输出生成的密码。
  7. 将生成的密码复制到剪贴板。
graph LR
  A[开始] --> B{文件存在检查}
  B -- No --> C[下载文件]
  B -- Yes --> D[获取参数]
  C --> D
  D --> E[生成明文]
  E --> F[应用Leetspeak规则]
  F --> G{检查密码规则}
  G -- No --> E
  G -- Yes --> H[输出密码]
  H --> I{所有密码生成完毕}
  I -- No --> E
  I -- Yes --> J[结束]

牛津 3000 单词

a
abandon
abandoned
ability
able
about
above
abroad
absence
absent
absolute
absolutely
absorb
abuse
academic
accent
……
year
yellow
yes
yesterday
yet
you
young
your
yours
yourself
youth
zero
zone

leetspeak 规则

原始字母形近数字形近字符
a4@
b8
c(
e3&
g9
i1!
l1
o0
q9
s5$
t7+
z2

检测字符串是否同时包含小写字母、大写字母、数字和特殊符号

#!/bin/bash

# 输入字符串
str="HellopRIvAt&-fuL1Y-DuR!n6-BraV3-wha7-c!G@R3++&-tHr&47EN-74r6et-CU+"

# 检查是否同时包含小写字母、大写字母、数字和特殊符号
if [[ "$str" =~ [a-z] ]] && [[ "$str" =~ [A-Z] ]] && [[ "$str" =~ [0-9] ]] && [[ "$str" =~ [^a-zA-Z0-9] ]]; then
    echo "字符串同时包含小写字母、大写字母、数字和特殊符号"
else
    echo "字符串并未同时包含小写字母、大写字母、数字和特殊符号"
fi

bash 脚本

803shots_so.png

#!/bin/bash

# Usage: ./generate_password.sh [word_count] [password_count]
# 
# Description: 该脚本用于生成随机密码,基于牛津3000单词列表。
# 可以通过传入参数来指定单词的个数,默认为 3。
# 可以通过传入第二个参数指定生成的密码个数,默认为 1。
# 生成的密码会输出到终端,并复制到剪贴板中。
#
# 参数:
# - word_count(可选): 指定单词的个数,默认为 3。
# - password_count (可选): 指定密码的个数,默认为1。

# 牛津3000单词列表文件路径
file_path="./The_Oxford_3000.txt"

# 检查文件是否存在,如果不存在则下载
if [ ! -f "$file_path" ]; then
    echo "正在下载牛津3000单词列表..."
    curl -O https://gist.githubusercontent.com/gandli/2534e8e0bd6256571bdd1618dcf3b1b1/raw/3adbe01ce31ef05ddfb8d9abdd81de0eb4762eb2/The_Oxford_3000.txt
fi

word_count=${1:-3}     # 获取传入的单词个数参数,默认为 3
password_count=${2:-1} # 获取传入的密码个数参数,默认为 1

for ((c = 1; c <= password_count; c++)); do
    password=""
    while true; do
        # 生成明文
        plaintext=$(
            shuf -n $word_count "$file_path" | tr '\n' ' '
            echo
        )
        plaintext=${plaintext%?}

        password=""
        # 根据规则转换明文为密码
        for ((j = 0; j < ${#plaintext}; j++)); do
            letter=${plaintext:j:1}
            leet=""
            # 对于每个字符,应用随机 Leetspeak 规则
            case "$letter" in
            a)
                leet=("a" "A" "4" "@")
                ;;
            b)
                leet=("b" "B" "8")
                ;;
            c)
                leet=("c" "C" "(")
                ;;
            d)
                leet=("d" "D")
                ;;
            e)
                leet=("e" "E" "3" "&")
                ;;
            f)
                leet=("f" "F")
                ;;
            g)
                leet=("g" "G" "9")
                ;;
            h)
                leet=("h" "H")
                ;;
            i)
                leet=("i" "I" "1" "!")
                ;;
            j)
                leet=("j" "J")
                ;;
            k)
                leet=("k" "K")
                ;;
            l)
                leet=("l" "L" "1")
                ;;
            m)
                leet=("m" "M")
                ;;
            n)
                leet=("n" "N")
                ;;
            o)
                leet=("o" "O" "0")
                ;;
            p)
                leet=("p" "P")
                ;;
            q)
                leet=("q" "Q" "9")
                ;;
            r)
                leet=("r" "R")
                ;;
            s)
                leet=("s" "S" "5" "$")
                ;;
            t)
                leet=("t" "T" "7" "+")
                ;;
            u)
                leet=("u" "U")
                ;;
            v)
                leet=("v" "V")
                ;;
            w)
                leet=("w" "W")
                ;;
            x)
                leet=("x" "X")
                ;;
            y)
                leet=("y" "Y")
                ;;
            z)
                leet=("z" "Z" "2")
                ;;
            *)
                leet=("$letter")
                ;;
            esac
            random_rule_index=$(shuf -i 0-$((${#leet[@]} - 1)) -n 1)
            letter=${leet[$random_rule_index]}
            password+="$letter"
        done

        # 检查密码是否符合要求,即必须包含大小写字母、数字和特殊符号
        if [[ $password =~ [a-z] && $password =~ [A-Z] && $password =~ [0-9] && $password =~ [^a-zA-Z0-9] ]]; then
            break
        fi
    done
    password=$(echo "$password" | tr ' ' '-')
    echo "明文为:$plaintext"
    echo "密码为:$password"
    echo -n "$password" | pbcopy
done

2023-05-14 20.13.45.gif

参考链接

三种方法,自动生成好记又好用的密码

注意事项

密码管理器的使用

虽然本文介绍了一种生成好记又好用的密码的方法,但随着越来越多的在线账户和应用程序,记住所有密码可能变得困难。为了确保密码的安全性,强烈建议使用密码管理器工具。

密码管理器可以帮助您安全地存储和管理所有的密码,免去记忆的烦恼。它们提供强大的加密功能,确保您的密码得到保护,并提供方便的自动填充功能,使登录过程更加便捷。选择一个可靠的密码管理器,并设定一个强密码来保护您的主密码。

重要账户的安全性

尽管我们希望密码能够被用户记住,但对于那些非常重要的账户(如电子邮件、银行账户等),使用一个健壮的、由密码管理器生成和存储的复杂密码可能是更好的选择。

这些重要账户往往储存着大量敏感信息,因此需要更高的安全性。建议您使用较长、复杂且难以猜测的密码,并启用多因素身份验证(如短信验证码、应用程序生成的代码等)以提供额外的安全层级。

记住,密码安全是您个人信息安全的第一道防线,因此请确保您的密码安全性并定期更换密码,以保护您的个人隐私和账户安全。