Linux下利用glibc2库和crypt()函数生成用户密码

 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dgd2010.blog.51cto.com/1539422/1712244

基本知识

Linux用户的密码由函数crypt()实现。crypt()是一个密码加密函数(将密码加密,明文变成密文),该函数基于数据加密标准(DES,Data Encryption Standard )算法以及基于DES的其他变种算法,该函数不依赖于计算机硬件实现数据加密。DES算法仅适合于加密字符串,也就是用于生成密码。尽管密码的生成有很多种方法。

(1)关于salt

salt是一种混淆key的一段范围在abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./中的“随机”字符串,具体最小长度和最大长度根据加密方法的不同而不同。更多信息可以参考网上的其他文档。

(2)加密策略

更精准的说,输入到系统中所谓密码,只是一个打开一段加密内容的key而已。按照这种说法,可以这样理解:

unique key+unique salt --> unique encryption,即根据key和salt能得到唯一的加密内容。

但最好的期望是:

unique encryption + unique salt !--> unique key,即根据加密内容和salt不能逆向得到key。

(3)关于glibc2和ctypt的相关知识,可以man glibc和man crypt的Linux Programmer's Manual ( 3, 7 ) 部分,或者自行搜索相关文档

(4)关于加密方法:

CentOS和Ubuntu里面的密码都是使用sha-512加密方法,sha-512与数字6对应。

其他的加密方法可以参考如下一段C语言定义:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

static const struct crypt_method methods[] = {

    /* method           

prefix  minlen, maxlen  rounds description */

    "des",            "",     

2,      2,      0,

        N_("standard 56 bit DES-based crypt(3)") },

    "md5",            "$1$",  8,      8,      0, "MD5" },

#if defined OpenBSD 

|| defined FreeBSD || (defined __SVR4 && defined __sun)

    

"bf",             "$2a$", 22,     22,     1, "Blowfish" },

#endif

#if 

defined HAVE_LINUX_CRYPT_GENSALT

    "bf",             "$2a$", 22,     

22,     1, "Blowfish, system-specific on 8-bit chars" },

    /* algorithm 2y 

fixes CVE-2011-2483 */

    "bfy",            "$2y$", 22,     22,     1, 

"Blowfish, correct handling of 8-bit chars" },

#endif

#if defined 

FreeBSD

    "nt",             "$3$",  0,      0,      0, "NT-Hash" 

},

#endif

#if defined HAVE_SHA_CRYPT

    /* http://people.redhat.com/drepper/SHA-crypt.txt */

    "sha-256",        "$5$",  8,      16,     1, "SHA-256" },

    

"sha-512",        "$6$",  8,      16,     1, "SHA-512" },

#endif

    /* http://www.crypticide.com/dropsafe/article/1389 */

    /*

     * Actually the maximum salt length is arbitrary, but 

Solaris by default

     * always uses 8 characters:

     * http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/ \

     *   

usr/src/lib/crypt_modules/sunmd5/sunmd5.c#crypt_gensalt_impl

     */

#if 

defined __SVR4 && defined __sun

    "sunmd5",         "$md5$"

8,     8,      1, "SunMD5" },

#endif

    { NULL,             NULL,   

0,      0,      0, NULL }

};

(5)Linux系统中的一段实例,可参见/etc/shadow文件

$6$yoursalt$005Gz1.zSYgebPp/u27h5ijAn9crpAcuFVJrnMb5CFmVfhIluNJCIv3w3frI1TF4C/THD8MHVpk4i3eVIuc8y1

其中,上述字符串中有3个$,$6$代表使用sha-512加密算法, $yoursalt$表示salt的值。

实现

(1)C语言实现:


1

vim encryptionwithcrypt.c


1

2

3

4

5

6

7

8

9

10

11

#define _XOPEN_SOURCE

#include <unistd.h>

#include <stdio.h>

int  main(void)

{

    char *encryption;

    char key[] = "yourkey";

    encryption= crypt(key, "$6$yoursalt$");

    printf("encryption is: %s\n", encryption);

    return 0;

}


1

2

gcc -lcrypt encryptionwithcrypt.c -o encryptionwithcrypt    

./encryptionwithcrypt

(2)其他工具实现:

如果不想借助crypt()函数生成密码,Ubuntu用户可以用whois包中提供的mkpasswd,命令得到密码,当然借助其他的工具也有其他办法。


1

2

3

# Ubuntu only, available on Ubuntu

which mkpassed || apt-get install -y whois

mkpasswd  --salt="yoursalt" --method=sha-512

参考

man 3 crypt   
man 3 shadow    
man 5 sahdow    
mkpasswd的源码,可通过apt-get source whois获得,解压tar.xz文件的方法:xz -d whois_5.1.1.tar.xz && tar xf whois_5.1.1.tar。

tag:Linux密码加密方式,Linux密码加密工具,Linux加密算法,Linux crypt(),mkpasswd whois

--end--

本文出自 “通信,我的最爱” 博客,请务必保留此出处http://dgd2010.blog.51cto.com/1539422/1712244

时间: 2024-11-01 22:28:04

Linux下利用glibc2库和crypt()函数生成用户密码的相关文章

交叉编译-linux下gtk的库文件有很多,不知道哪一个是我用的

问题描述 linux下gtk的库文件有很多,不知道哪一个是我用的 我做的应用运行在手持终端,基于一个精简的Linux系统.用的gcc-arm-linux交叉编译工具 现在我就想搞清楚头文件和库文件在哪里,makefile脚本很复杂而且有很多文件,完全看不懂,只能凭目录名称去找...头文件在/usr/local/arm-linux/include/gtk/下库文件用locate libgtk查找有一大堆,目测有关系的有下面这些:/usr/local/arm-linux/arm-linux/lib/

Linux下,动态库和静态库之间是否能够相互转化?

问题描述 Linux下,动态库和静态库之间是否能够相互转化? Linux下,动态库和静态库之间是否能够相互转化呢?现在我有一些动态共享库.so,但发布程序的时候总得在目标服务器上安装这些库,程序才能运行,我想把它们转化为静态库.a,能做到么?有这样的工具吗?谢谢大家. 解决方案 通过makefile编译的时候,生成一份动态,一份静态 解决方案二: 我有动态库文件so,但是没有源码.我现在希望做的是:动态库.so转化为静态库.a.大家帮帮忙啊.

linux下so动态库一些不为人知的秘密(上)

 linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名.二者都使用广泛.本文主要讲动态库方面知识.        基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看  # ldd /bin/ls linux-vdso.so.1 => (0x00007fff597ff000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00000036c2e00000) librt.so.1 =

linux下so动态库一些不为人知的秘密(中)

上一篇(linux下so动态库一些不为人知的秘密(上))介绍了linux下so一些依赖问题,本篇将介绍linux的so路径搜索问题.      我们知道linux链接so有两种途径:显示和隐式.所谓显示就是程序主动调用dlopen打开相关so;这里需要补充的是,如果使用显示链接,上篇文章讨论的那些问题都不存在.首先,dlopen的so使用ldd是查看不到的.其次,使用dlopen打开的so并不是在进程启动时候加载映射的,而是当进程运行到调用dlopen代码地方才加载该so,也就是说,如果每个进程

linux下so动态库一些不为人知的秘密(中二)

继续上一篇< linux下so动态库一些不为人知的秘密(中) >介绍so搜索路径,还有一个类似于-path,叫LD_RUN_PATH环境变量, 它也是把路径编译进可执行文件内,不同的是它只设置RPATH.  [stevenrao] $ g++ -o demo -L /tmp/  -ltmp main.cpp  [stevenrao] $ readelf -d demo  Dynamic section at offset 0xb98 contains 25 entries:   Tag    

嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误

    嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报  分类:   嵌入式(928)  一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的. 在glibc头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈.   [cpp] vie

Linux下vsftp的重新安装和配置虚拟用户

Linux下vsftp的重新安装和配置虚拟用户 重新安装和配置虚拟用户 以下都是在root用户下进行的 #tar zxvf vsftpd-2.0.5.tar.gz --解压 #cd vsftpd-2.0.5.tar.gz --解压后进入vsftpd-2.0.5.tar.gz目录 # mkdir /usr/share/empty/ --VSFTPD默认设置需要一个空目录:/usr/share/empty # mkdir /var/ftp/ --如果容许匿名用户(anonymous),那么你将需要一

在Window和Linux下使用Zthread库

ZThread库是一个开源的跨平台高级面向对象的线性和sycnchronization 库,以运行POSIX 和Win32 系统中的C++程序. ZThread库的主页:http://zthread.sourceforge.net 最新版本Zthread远吗下载地址: http://prdownloads.sourceforge.net/zthread/ZThread-2.3.2.tar.gz ZThread文档:http://zthread.sourceforge.net/documentat

Linux下利用ioctl函数获取网卡信息

linux下的ioctl函数原型如下: #include <sys/ioctl.h> int ioctl(int handle, int cmd, [int *argc, int argv]) 函数成功返回0,失败返回-1. 其相关命令接口如下:   类别 Request 说明 数据类型 套 接 口 SIOCATMARK SIOCSPGRP SIOCGPGRP 是否位于带外标记 设置套接口的进程ID 或进程组ID 获取套接口的进程ID 或进程组ID int int int 文 件 FIONBI