现在各种密码保存的软件,自己的密码都可以不用记着了,那么我们为了密码更加安全就完全可以使用随机生成的密码了,连我们自己的想不到的密码就比全部用自己的常用密码要安全许多。这个密码生成脚本是使用openssl的命令来生成,在Mac系统里是自带这个软件的。

使用openssl生成密码

#!/bin/zsh

if [ ! $1 ]
then
	len=9
elif [ "-h" = $1 ]
then
	echo "Usage: genpd			 Generate a 10-digit password."
	echo "Usage: genpd [number]		 Generate a number-digit password."
	exit 1
elif [ "$1" -gt 0 ] 2>/dev/null
then
	len=$1
else
	echo "illegal option -- $1      must number or [-h]"
	exit 2
fi

openssl rand -base64 $len

脚本写完后给它可执行权限,然后将其放到环境变量里,或者在文件的当前目录执行该脚本。

默认不加任何参数的话,随机种子使用的是9个,一般3的倍数不会输出最后的=,建议使用3的倍数。

使用自定义随机函数生成密码

如果不想使用openssl生成的密码,还可以使用下面我自己写的一个函数来生成密码。原理是使用系统随机函数从大小写字母、数字、常见符号中拿到一串随机的字符串作为密码。

#!/bin/zsh

function generator(){
	passwd=""
	base_str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.;><?[]{}~!@#$%^&*()-=+1234567890"
	for i in `seq 1 $1`;do
		pos=$RANDOM%${#base_str}
		char=${base_str:${pos}:1}
		passwd=$passwd$char
	done;
	echo $passwd
}

if [ ! $1 ]
then
	len=18
elif [ "-h" = $1 ]
then
	echo "Usage: genpd			 Generate a 10-digit password."
	echo "Usage: genpd [number]		 Generate a number-digit password."
	exit 1
elif [ "$1" -gt 0 ] 2>/dev/null
then
	len=$1
else
	echo "illegal option -- $1      must number or [-h]"
	exit 2
fi

generator $len

使用系统字符生成安全密码

将上面两种的方式也加入到选项中,可通过指定参数选择生成方式。

#!/bin/zsh

function generator(){
	passwd=""
	base_str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.;><?[]{}~!@#$%^&*()-=+1234567890"
	for i in `seq 1 $1`;do
		pos=$RANDOM%${#base_str}
		char=${base_str:${pos}:1}
		passwd=$passwd$char
	done;
	echo $passwd | pbcopy
	pbpaste
}

len=18

while getopts "l:osgh" args;
do
	case $args in
		l)
			len=$OPTARG
			;;
		s)
			# generate a secure password and copy to clipboard
			LC_ALL=C tr -dc "[:alnum:]" < /dev/urandom | head -c $len | pbcopy
			pbpaste
			echo "\npassword has copyed to clipboard."
			break
			;;
		o)
			openssl rand -base64 $len | pbcopy
			pbpaste
			echo "password has copyed to clipboard."
			break
			;;
		h)
			echo "Usage: genpd [-s|-o|-g]                 Generate a 18-digit password."
			echo "Usage: genpd -l [number] [-s|-o|-g]     Generate a number-digit password."
			echo "[-s]: Generate a safe password."
			echo "[-o]: Generate a password containing characters."
			echo "[-g]: Generate a password containing all common characters."
			break
			;;
		g)
			generator $len
			echo "password has copyed to clipboard."
			;;
		?)
			echo "illegal option -- $args      you can use genpd -h."
			exit 1
			;;
		esac
done

如果你还有什么好的方案也可以在评论区中留言。