首先查看 /etc/shadow文件,来观察加密后的密码结构:
$加密方法$ 8位随机数$加密后的密码串
不同的加密方法决定了加密后的密码串的特性,使用以下命令查看可用的加密方法:
# man 3 crpt
目前使用的加密方式主要有以下几类:
1.对称加密
使用对称加密,加密和解密都使用同一个密钥,其特点是速度快,常用的方式为:3DES(Data Encrypt Standard),该方法采用56位密钥,其中3表示运行三轮;AES(Advanced Encrypt Standard),采用变长密钥。
对称加密的缺陷在于密钥的管理及分发比较困难。
2.公钥加密
公钥加密也叫非对称加密,即采用 私钥/公钥 (S/P)--> (security/public) 的加密方。其中私钥加密的文件只能用与之对应的公钥解密,反之亦然。但是公钥可以从私钥中提取出来,因此有私钥,则可以推测出公钥;反之则不行。
公钥加密的特点是加密速度慢,但是安全性高。它通常用于密钥的分发,主要采用的算法有RSA和DSA。
3.单向加密
单向加密只能加密,不能解密。它是hash算法的一种。主要用于提取数据的特征码,其特征为:
a)无论是输入多大的数据,其输出是定长的。
b)如果输入的数据一样,结果必然一样,反之,输入的数据有微小的改变,将引起输出的巨大变化,通常称为“蝴蝶效应”和“雪崩效应”。单向加密这些特征可以避免加密串被反向推断。
例如我们可以进行以下操作来演示微小的改变采用单向加密后,会引起结果的巨大变化:
# cp /var/log/messages ./
# md5sum messages // 采用md5的方式为文件messages 加密
# nano messages // 在messages 中的增加一个字母
# md5sum messages // 再次对文件messages加密以观察输出结果
单向加密采用的算法有如下几种:
md5 (Message Digest): 输出定长为128bit的加密串
SHA (Secure Hash Algorithm):
sha1: 输出定长为160bits的加密串
sha-256: 256bits: 输出定长为256bits的加密串
sha-512: 512bits: 输出定长为512bits的加密串
根据单向加密的特性――只能加密不能解密,因此在验证密码是否正确时,采用的做法是再次对数据进行加密,如果加密结果一致,则密码正确。
这样的加密方式会产生一个安全隐患,即两个人用了相同的密码,则可能产生相同的加密串。
为了避免这样的情况出现,需要引入一个新的机制:salt(盐),即8位随机数。具体的操作是每次加密时,都添加8位的随机数,由于“蝴蝶效应”/“雪崩效应”的存在,8位随机数可以使密码串产生巨大的变化。
例如我们可以为用户hbase 和 redis都设定相同的密码123,来比较二者的加密结果:
# tail /etc/shadow
# passwd mongodb
# passwd redis
# tail /etc/shadow
上述例子我们可以看到8位随机数在单向加密中的作用。事实上,我们可以自行指定salt,如果两个密码8位随机数相同,密码也相同,则加密串会完全一致。例如为文件messages加密时指定随机数:
# openssl passwd -1 -salt 12345678 messages
# openssl passwd -1 -salt 12345678 messages
# openssl passwd -1 -salt 12345698 messages
此例子可以看出随机数设定一致,则加密串一致,随机数细微改变,可以完全改变加密串的结果。