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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:
  原创作品,允许转载,转载时请务必以超链接形式标明文章   原始出处   、作者信息和本声明。否则将追究法律责任。 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

目录
相关文章
|
11天前
|
Linux
【Linux】System V信号量详解以及semget()、semctl()和semop()函数讲解
System V信号量的概念及其在Linux中的使用,包括 `semget()`、`semctl()`和 `semop()`函数的具体使用方法。通过实际代码示例,演示了如何创建、初始化和使用信号量进行进程间同步。掌握这些知识,可以有效解决多进程编程中的同步问题,提高程序的可靠性和稳定性。
53 19
|
13天前
|
Linux Android开发 开发者
linux m、mm、mmm函数和make的区别
通过理解和合理使用这些命令,可以更高效地进行项目构建和管理,特别是在复杂的 Android 开发环境中。
46 18
|
26天前
|
存储 编译器 Linux
动态链接的魔法:Linux下动态链接库机制探讨
本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。
352 22
|
21天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
89 13
|
3月前
|
安全 Linux 数据安全/隐私保护
Linux 忘记密码解决方法
Linux 忘记密码解决方法
59 2
Linux 忘记密码解决方法
|
3月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
120 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
Linux Shell 数据安全/隐私保护
Linux如何在服务器上进行密码的修改?
【10月更文挑战第6天】Linux如何在服务器上进行密码的修改?
374 1
|
3月前
|
Linux 数据安全/隐私保护 索引
linux inode索引节点使用率100% 解决+hustoj忘记密码+最新MDK注册方法
linux inode索引节点使用率100% 解决+hustoj忘记密码+最新MDK注册方法
53 1
|
3月前
|
Ubuntu Linux Shell
Linux系统密码忘记
【10月更文挑战第2天】在Linux系统中,若忘记密码,可以通过单用户模式或使用Live CD/USB来重置。对于Ubuntu系统,可通过GRUB引导菜单进入单用户模式,利用命令行重置密码;或使用Live CD/USB启动并挂载硬盘分区后修改密码文件。CentOS系统同样支持单用户模式重置密码,也可借助安装介质进入救援模式,挂载文件系统后进行密码重置。这些方法均能在忘记密码的情况下帮助恢复系统访问。
|
4月前
|
安全 Linux 数据安全/隐私保护
Linux强制修改用户密码
【9月更文挑战第21天】在 Linux 系统中,可使用以下方法强制修改用户密码:1. 使用 `passwd` 命令,以 root 身份运行 `passwd username` 修改密码,加 `-f` 选项可跳过复杂度检查;2. 使用 `chpasswd` 命令,通过文本文件批量设置密码;3. 结合 `usermod -e 0 username` 和 `chpasswd` 强制用户下次登录时更改密码。注意操作时需确保安全性与合理性。
411 4