您的位置:首页 > 运维架构 > Linux

Linux 用户密码的加密方式

2014-12-11 17:46 239 查看
Linux /etc/shadow文件中的记录行与/etc/passwd中的一一对应,存放着用户的密码哈希值。它由pwconv命令根据/etc/passwd中的数据自动产生。它的文件格式与/etc/passwd类似,由若干个字段组成,字段之间用“

Linux /etc/shadow文件中的记录行与/etc/passwd中的一一对应,存放着用户的密码哈希值。它由pwconv命令根据/etc/passwd中的数据自动产生。它的文件格式与/etc/passwd类似,由若干个字段组成,字段之间用“:”隔开。这些字段是:
海姹网(网址:http://www.seacha.com),标签:Linux 用户密码的加密方式, 加密,用户,shadow

登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

1)“登录名”是与/etc/passwd文件中的登录名相一致的用户账号
2)“口令”字段存放的是加密后的用户口令字,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合{./0-9A-Za-z}中的字符,则对应的用户不能登录。
海姹网(网址:http://www.seacha.com),标签:Linux 用户密码的加密方式, 加密,用户,shadow
3)“最后一次修改时间”表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。例如在SCOLinux中,这个时间起点是1970年1月1日。
4)“最小时间间隔”指的是两次修改口令之间所需的最小天数。
海姹网(网址:http://www.seacha.com),标签:Linux 用户密码的加密方式, 加密,用户,shadow
5)“最大时间间隔”指的是口令保持有效的最大天数。
6)“警告时间”字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
7)“不活动时间”表示的是用户没有登录活动但账号仍能保持有效的最大天数。
8)“失效时间”字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。
海姹网(网址:http://www.seacha.com),标签:Linux 用户密码的加密方式, 加密,用户,shadow

下面是/etc/shadow的一个例子:

[root@50_host ~]# cat /etc/shadow | grep root
root:$6$ICPKdEabvcPXHUUt$dnQiverdy/ /CaqP715mMkfpPD0eDUaEP3UvJvxzb7Bb8pZscdOTEnuMu7wC6Qvg5 wdv5fr20GCK7C.A7TooJ70:15986:0:99999:7:::
海姹网(网址:http://www.seacha.com),标签:Linux 用户密码的加密方式, 加密,用户,shadow

[root@51_host ~]# cat /etc/shadow | grep root
root:$1$g4KcQcnM$0KK9hg6VTPZ9Qfm1gHdTu/:15986:0:99999:7:::

其中shadow中存放的密码密文格式如下:

$id$salt$encrypted

其中id是指使用的哈希算法:
可取如下值:
    ID  | Method
--------------------------
海姹网(网址:http://www.seacha.com),标签:Linux 用户密码的加密方式, 加密,用户,shadow
     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)

salt:是使用上面hash算法对密码进行hash的一个干扰值。
海姹网(网址:http://www.seacha.com),标签:Linux 用户密码的加密方式, 加密,用户,shadow

encrypted: 这个值即 密码的hash, 但不是直接的hash("passwd"),而是hash("passwd+salt")后,再经过编码。

实际应用:
1. 在有shadow文件的前提下暴力破解(也只能暴力破解)用户密码
2. 实现自己的passwd命令。某种场景下是很有用的(在云计算中,可以方便的为使用同一模板的linux虚拟机生成不同密码)
海姹网(网址:http://www.seacha.com),标签:Linux 用户密码的加密方式, 加密,用户,shadow

示例:
该程序使用linux 系统中的crypt函数生成可替换shadow中密码域中的密码hash。

#include <stdio.h>
#include <unistd.h>

//crypt 使用方式参见man crypt
//exemple:
//./bin password $6$ffffffff

海姹网(网址:http://www.seacha.com),标签:Linux 用户密码的加密方式, 加密,用户,shadow
int main(int argc, char *argv[])
{
    if(argc!=3)
        return -1;

    char *buf = crypt((const char *)argv[1], (const char *)argv[2]);

    printf("salt: %s, crypt: %sn", argv[2], buf);

    return 0;
}

编译方法:gcc a.c -lcrypt -o passwd
海姹网(网址:http://www.seacha.com),标签:Linux 用户密码的加密方式, 加密,用户,shadow
使用: ./passwd 654321 $1$g4KcQcnM
会输出:
salt: $1$g4KcQcnM, crypt: $1$g4KcQcnM$0KK9hg6VTPZ9Qfm1gHdTu/

使用 $1$g4KcQcnM$0KK9hg6VTPZ9Qfm1gHdTu/ 替换 shadow 文件中你要修改的用户中的密码域,密码便自动修改成了654321。

crypt密码加密函数简介:

原型:

char * crypt (const char *key,const char * salt);

头文件:

#include <unistd.h>

crypt是个密码加密函数,它是基于Data Encryption Standard(DES)演算法。crypt只适用于密码的使用,不适合用于资料加密。

crypt()将参数key所指的字符串加以加密,key字符串长度仅取前8个字符,超过此长度的字符没有意义。参数salt为两个字符组成的字符串,由a-z、A-Z、0-9,“.”和“/”所组成,用来决定使用4096 (a-z、A-Z、0-9,“.”和“/”共64个字符,64的平方为4096)种不同内建表格的哪一个。函数执行成功后会返回指向编码过的字符串指针,参数key 所指的字符串不会有所更动。编码过的字符串长度为13 个字符,前两个字符为参数salt代表的字符串。

返回值: 返回一个指向以NULL结尾的密码字符串。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: