【转】/etc/shadow 口令的加密方法

原文出处: http://ly50247.appspot.com/2010/12/24/shadow_hash.html

 

linux的/etc/shadow是专门用于存放用户口令的,以前一直听说口令是用md5加密(其实是hash)过的,但里连的格式和md5sum生成的并不一样。可以查看下/etc/shadow,对该文件不了解的话可以上网查询。

下面来看第二列(这个是我随便生成的,并不是系统的):

$1$eCeLr51L$/1EEtFr8iQ.TySiJKHQRQ/

可以看出格式比较奇怪,里边有三个$,还有./等东西,而md5sum生成的hash类似这样

1$ echo -n password|md5sum

25f4dcc3b5aa765d61d8327deb882cf99  -

是十六进制串。显然shadow不是将口令直接md5sum得到的。其余可以 man 3 crypt 了解一下,内容太多,只贴一部分:

-------------

       If  salt is a character string starting with the characters "$id$" fol‐
       lowed by a string terminated by "$": 

              $id$salt$encrypted

       then instead of using the DES machine,  id  identifies  the  encryption
       method  used  and  this  then  determines  how the rest of the password
       string is interpreted.  The following values of id are supported:

              ID  | Method
              ─────────────────────────────────────────
              1   | MD5
              2a  | Blowfish (not in mainline glibc; added in some
                  | Linux distributions)
              5   | SHA-256 (since glibc 2.7)
              6   | SHA-512 (since glibc 2.7)
-------------

基本可以了解格式了。

也就是说hash方法是可以选择的,只有$1$就是MD5,而且产生这个还需要一个salt,它是一个8字节的字符串,hash是根据它和口令一样生成的,而shadow里这个salt是随机生成的。

可以写个程序试验一下:

01#define _XOPEN_SOURCE

02#include <stdio.h>

03#include <unistd.h>

04int main(int argc, char *argv[])

05{

06 char key[20] = "password";

07 char salt[20] = "$1$eCeLr51L33";

08 printf("%s\n", crypt(key, salt));

09

10 return 0;

11}

其余最开始的 $1$eCeLr51L$/1EEtFr8iQ.TySiJKHQRQ/ 就是用它生成的。shadow用的基本也是这个方法,只是那个salt不是确定的,可以用mkpasswd进行生成。

它虽然说是md5 Method,但和md5sum并不相同,二者也不可以互相转换。

posted @ 2012-07-10 20:48  bourneli  阅读(8368)  评论(0编辑  收藏  举报