openssl passwd

openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.htmlhtml


该伪命令用于生成加密的密码。python

[root@xuexi tmp]# whatis passwd
passwd               (1)  - update user's authentication tokens
passwd               (5)  - password file
passwd [sslpasswd]   (1ssl)  - compute password hashes

直接man passwd会获得修改用户密码的passwd命令帮助,而不是openssl passwd的帮助,因此man sslpasswd。nginx

[root@xuexi tmp]# man sslpasswd

NAME
       passwd - compute password hashes

SYNOPSIS
       openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-quiet] {password}

使用openssl passwd支持3种加密算法方式:不指定算法时,默认使用-crypt。算法

选项说明:apache

-crypt:UNIX标准加密算法,此为默认算法。若是加盐(-salt)算密码,只取盐的前2位,2位后面的全部字符都忽略。工具

-1(数字):基于MD5的算法代号。更多的算法代号见"http://www.cnblogs.com/f-ck-need-u/p/7011460.html#blog222"。测试

-apr1(数字):apache中使用的备选md5算法代号,不能和"-1"选项一块儿使用,由于apr1自己就默认了md5。htpasswd工具生成的身份验证密码就是此方法。ui

-salt:加密时加点盐,能够增长算法的复杂度。但加了盐会有反作用:盐相同,密码相同,加密的结果将同样。加密

-in file:从文件中读取要计算的密码列表spa

-stdin:从标准输入中获取要输入的密码

-quiet:生成密码过程当中不输出任何信息

在命令行中直接输入要加密的密码password或者使用-salt时,将不须要交互确认,不然会交互确认密码。

[root@xuexi ~]# openssl passwd 123456 ; openssl passwd 123456 
R7J9OiPEN5xUw
C1lvfmeMltEWw

由上面的测试可知,使用默认的-crypt加密的密码是随机的。可是加入盐后,若是密码同样,盐同样,那么加密结果同样。

[root@xuexi ~]# openssl passwd -salt 'xxx' 123456 ; openssl passwd -salt 'xxx' 123456
xxkVQ7YXT9yoE
xxkVQ7YXT9yoE

同时也看到了-crypt加密算法只取盐的前两位。

若是盐的前两位和密码任意一个不同,加密结果都不同。

[root@xuexi ~]# openssl passwd -salt 'xyx' 123456;openssl passwd -salt 'xxx' 123456
xyJkVhXGAZ8tM
xxkVQ7YXT9yoE

注意,默认的-crypt只取盐的前两位字符,因此只要盐的前两位同样,即便第三位不一样,结果也是同样的。

[root@xuexi ~]# openssl passwd -salt 'xyz' 123456 ; openssl passwd -salt 'xyy' 123456
xyJkVhXGAZ8tM
xyJkVhXGAZ8tM

测试下MD5格式的加密算法。

[root@xuexi ~]# openssl passwd -1 123456 ; openssl passwd -1 123456     
$1$CJ1eA7bT$4VAJoS3hU/gRTrSQ8r8UQ.
$1$l1uIsNoH$A35cHQ6oGm29IJOas5v7w0

可见,结果比-crypt的算法更长了,且不加盐时,密码生成是随机的。

[root@xuexi ~]# openssl passwd -1 -salt 'abcdefg' 123456 ; openssl passwd -1 -salt 'abcdefg' 123456
$1$abcdefg$a3UbImglR4PCA3x7OvwMX.
$1$abcdefg$a3UbImglR4PCA3x7OvwMX.

能够看出,加了盐虽然复杂度增长了,可是也受到了"盐相同,密码相同,则加密结果相同"的限制。另外,盐的长度也再也不限于2位了。

再为apache或nginx生成访问网页时身份验证的密码,即basic authentication验证方式的密码。

[root@xuexi ~]# openssl passwd -apr1  123456 ; openssl passwd -apr1 123456
$apr1$ydbBroeI$/9YsZR.tJI/GS0YswkQLJ.
$apr1$ncebpB6C$4fnRmlrnL2LPKxrZxCZzJ1
[root@xuexi ~]# openssl passwd -apr1 -salt 'abcdefg' 123456 ;  openssl passwd -apr1 -salt 'abcdefg' 123456
$apr1$abcdefg$PCGBZd8XFTLOgZzLLU3K00
$apr1$abcdefg$PCGBZd8XFTLOgZzLLU3K00

一样,加了盐就受到"盐相同,密码相同则加密结果相同"的限制。

关于openssl passwd文件,它生成的密码能够直接复制到/etc/shadow文件中,但openssl passwd由于不支持sha512,因此密码强度不够。若是要生成sha512的密码,可使用grub-crypt生成,它是一个python脚本,只不过很不幸CentOS 7只有grub2,grub-crypt命令已经没有了。

[root@xuexi ~]# grub-crypt --sha-512
Password:
Retype password:
$6$2RCBJT7rELpfX4.Q$iKM5vNShNqUcCiez.JDBgbRkj007eXVVs790UwiOw1PMvB/s/vE7DhyDe8YJ6T8aEtP0Vev5kMReL/nILwLZX/

 可使用语句简单地代替grub-crypt。

python -c 'import crypt,getpass;pw=getpass.getpass();print(crypt.crypt(pw) if (pw==getpass.getpass("Confirm: ")) else exit())'

grub-crypt和上述python语句都是交互式的。若是要非交互式,稍稍修改下python语句:

python -c 'import crypt,getpass;pw="123456";print(crypt.crypt(pw))'
</div
相关文章
相关标签/搜索