Ubuntu系统中/etc目次下有三个和用户登录拜候节制相干的文件:passwd、shadow、group。之前比较老的Unix系统将颠末哈希措置的暗码直接放在passwd文件中,此刻的*nix则把颠末措置的暗码放在shadow这个文件中。
打开/etc/shadow文件内容以下图:
可以看到从“$6$”开端到“GJr..”结束这一段字符是颠末哈希措置的用户暗码,那么我们此刻想知道这个字符串是若何生成的,我们查看了Ubuntu官方的文档:
shadow文件申明:http://manpages.ubuntu.com/manpages/karmic/man5/shadow.5.html
crypt加密算法申明:http://manpages.ubuntu.com/manpages/karmic/man3/crypt.3.html
从官方文档中我们可以知道用户暗码颠末端glibc中的crypt算法的措置,“$6$3rhg9.la$”是哈希过程中利用到的盐值,那么盐值有甚么感化呢?我们知道对一个已知的哈希算法和一个固定的字符串来讲,其哈希的成果是不异的,那么假定一个系统中有良多用户,那么此中的一些用户便可能利用不异的暗码,例如两人都利用了“123456”作为登岸暗码,那么在不利用盐值的环境下,颠末措置的暗码字符串就是一样的。当然“不法进侵者”没法直接从颠末措置的字符串获得明文暗码,但仍然可以知道有两小我利用了不异的暗码。为了不这类环境,我们便可以在对用户的暗码进行哈希时在原始暗码的后边拼上一个盐值(m//salt),如许做的好处有两个:一方面因为盐值随机产生,避免不异暗码产生同意的哈希值;另外一方面增加了进侵者暴力破解的计较复杂度(增加了2^|salt|倍)。“$6$3rhg9.la$”分为两个部门:“6”和“3rhg9.la”,第一个参数是哈希算法选择参数,在官方文档中已提到,第二个是随机产生的字符串。
python自带的crypt算法可以调用glibc中的crypt算法,我们打开python源文件中lib目次下的crypt.py文件可以看到python对glibc中的crypt算法的调用过程:
def crypt(word, salt=None):
"""Return a string representing the one-way hash of a password, with a salt
prepended.
If ``salt`` is not specified or is ``None``, the strongest
available method will be selected and a salt generated. Otherwise,
``salt`` may be one of the ``crypt.METHOD_*`` values, or a string as
returned by ``crypt.mksalt()``.
"""
if salt is None or isinstance(salt, _Method):
salt = mksalt(salt)
return _crypt.crypt(word, salt)
打开glibc源文件中crypt目次下的crypt-entry.c文件,我们可以看到按照盐值前三个字符进行哈希算法选择的代码:
/* Define our magic string to mark salt for MD5 encryption
replacement. This is meant to be the same as for other MD5 based
encryption implementations. */
static const char md5_salt_prefix[] = "$1$";
/* Magic string for SHA256 encryption. */
static const char sha256_salt_prefix[] = "$5$";
/* Magic string for SHA512 encryption. */
static const char sha512_salt_prefix[] = "$6$";
/* For use by the old, non-reentrant routines (crypt/encrypt/setkey) */
extern struct crypt_data _ufc_foobar;
在测试过程中最开端下载的是glibc2.6,这个版本并没有$5$和$6$对应的sha256/sha512算法,只有MD5,然后下载了最新的glibc2.18版本才看到了这两个算法,可以猜出利用glibc2.6版本及之前的版本的linux系统中,shadow文件其实不是此刻如许的。本Ubuntu系统的gblic版本是2.11(ldd --version查看),该版本glibc也撑持sha256/sha512。我们给出的例子里前三个字符是“$6$”,我们可以知道系统利用的哈希算法是sha512。因为python调用的是glibc中的crypt算法,所以天然可以知道在windows平台下python的这个算法是没法调用的。此刻利用python写一些脚本来测试一下:
在crypt函数中输进两个参数,一个是我们的登岸暗码,另外一个是盐值,我们可以看到输出的成果和shadow文件中颠末措置的暗码字符串不异。
shadow文件默许只能由root用户拜候,一般用户没有拜候权限,不法进侵者经由过程必然路子获得该文件后经由过程暴力测验测验暗码就有可能获得原始的明文暗码,所以用户在设置暗码的时辰尽可能包含多种字符(大年夜小写、数字、特别符号)并超越必然的长度,以此来晋升系统的安然性