linux crypt函数


1. crypt定义

#define _XOPEN_SOURCE /* See feature_test_macros(7) */
#include <unistd.h >
char *crypt(const char *key, const char *salt);

上面是man 3 crypt看到的crypt函数定义。
从定义中看到要想使用crypt函数那么就得定义_XOPEN_SOURCE宏,有一些人只是把unistd.h包含进来,然后发现编译的时候出现crypt未定义的情况。

2. key、salt

在TLPI一书中提到“crypt()算法会接受一个最长可达8字符的密钥(即key),并施以数据加密算法(DES)的一种变体。salt参数指向一个两个字符的字符串,用来扰动(改变)DES算法。该函数返回一个指针,指向长度13个字符的字符串。”,这个对crypt函数的一个看似简单的描述让我顿时产生了两个疑问:

  1. 难道crypt函数最多只能处理8字符的密钥吗?是不是意味着crypt(“liulaogen123”, “salt”)==crypt(“liulaogen234”, “salt”)?

  2. salt最多只能是两个字符吗?那这个salt得组合那就非常有限,对于防止碰撞就非常弱了。

“实践是检验真理的唯一标准”,那么我们就用代码来验证我的疑问:

/*************************************************************************> File Name: auth.c> Author: lxg> Mail: liuxingen@nsfocus.com> Created Time: 2015年06月28日 星期日 10时27分19秒************************************************************************/#define _XOPEN_SOURCE
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>int main(int argc, char *argv[])
{if(argc != 3){fprintf(stderr, "%s salt key\n", argv[0]);return 1;}char *encrypted = NULL;if((encrypted = crypt(argv[2], argv[1])) == NULL){fprintf(stderr, "crypt error:%s\n", strerror(errno));}printf("%s encrypted:%s\n", argv[2], encrypted);return 0;
}

lxg@lxg-X240:~/station/TLPI/chapter_8$ ./auth abc liulaogen123
liulaogen123 encrypted:abJHmGH1Hal.6
lxg@lxg-X240:~/station/TLPI/chapter_8$ ./auth abc liulaogen234
liulaogen234 encrypted:abJHmGH1Hal.6
lxg@lxg-X240:~/station/TLPI/chapter_8$ ./auth abc liulaogn234
liulaogn234 encrypted:abjcY/j5FUQVg

从上面的输出来看确实验证了我们的第一个疑问,crypt接受一个最长可达8字符的密钥key,大于8个字符的部分会被丢弃。

lxg@lxg-X240:~/station/TLPI/chapter_8$ ./auth abc liulaogn234
liulaogn234 encrypted:abjcY/j5FUQVg
lxg@lxg-X240:~/station/TLPI/chapter_8$ ./auth abd liulaogn234
liulaogn234 encrypted:abjcY/j5FUQVg
lxg@lxg-X240:~/station/TLPI/chapter_8$ ./auth acd liulaogn234
liulaogn234 encrypted:acJlJNjY0hjOQ

上面的这个示例解答了第二个疑问,crypt的salt指向一个两个字符的字符串,大于2个字符的部分会被丢弃。
上面的两个示例的输出来看无论输入是什么输出的的都是长度为13个字符的字符串。

3. crypt的算法

crypt默认使用的密钥长度为56bit的变体DES算法,我们知道56bit的DES加密在现在日益加强的软、硬件条件下很容易就被破解了,在crypt的man手册中也给出了warning:

Warning: The key space consists of 2**56 equal 7.2e16 possible values. Exhaustive searches of this key space are possible using massively parallel computers. Software, such as crack(1), is available which will search the portion of this key space that is generally used by humans for passwords. Hence, password selection should, at minimum, avoid common words and names. The use of a passwd(1) program that checks for crackable passwords during the selection process is recommended.

那么crypt还有其它的算法吗?因为从上面的key、salt章节和默认使用的DES算法来看这个函数基本是不能用的,我们伟大的linux应该是不会允许这样弱的东西存在的。那么我们接着man手册往下看,在NOTES中我们发现了crypt更强大的部分,在glibc2版本的crypt函数中支持额外的加密算法
crypt支持的额外加密算法有MD5、Blowfish(某些特定的Linux系统支持)、SHA-256(glibc2.7开始)、SHA-512(glibc2.7开始),怎么来区分这些额外的加密算法呢?那就是通过salt来进行区分,如果salt以“$id$salt$encrypted” 这样的格式那么就会根据id的不同值选择不同的加密算法来代替默认的DES算法,id的格式如下:

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

$5$salt$encrypted 的salt代表crypt函数使用SHA- 256加密算法
$6$salt$encrypted 的salt代表crypt函数使用SHA-512加密算法
$salt$ 中的salt最多支持长度为16字符的字符串,相比默认的DES算法支持最长为2字符有了很大的改进,最后crypt的返回值根据加密算法的不同也有不同长度的字符串返回。

   MD5     | 22 charactersSHA-256 | 43 charactersSHA-512 | 86 characters

4. linux密码验证

我们可以查看一下linux中(ubuntu)中密码验证使用的加密算法,怎么来确定呢?其实很简单,查看/etc/shadown文件中密码加密部分就能知道:

$6$at9hFDRi$bTr371ETSBzrRi3e3d229Bedn8g97shPktUcdGk2GlB2Nj2KWTxPmY0wBx A0Xn2395lAgX6ltLnbKvvzgXjhc.

上面是我截取的我电脑中shadow文件root用户的密码部分,从这里可以看出ubuntu使用的是AES-512加密算法。
关于密码推荐大家看这篇文章:passwords

linux crypt函数相关推荐

  1. linux crypt函数位置,Linuc C加密函数crypt()

    crypt()函数可以加密8个字节的数据,提供2字节的扰码,返回一个指向13个ASCII字符串的指针. #include "crypt.h"    // 没有此行每次计算crypt ...

  2. crypt函数的使用(仅限LINUX)

    2019独角兽企业重金招聘Python工程师标准>>> crypt() 函数返回使用 DES.Blowfish 或 MD5 加密的字符串. 在不同的操作系统上,本函数的行为不同,某些 ...

  3. linux c语言内核函数手册,Linux C函数实例速查手册

    函数学习目录: 第1章 初级I/O函数 1.1 close函数:关闭已经打开的文件 1.2 creat函数:创建一个文件 1.3 dup函数:复制文件描述符 1.4 dup2函数:复制文件描述符到指定 ...

  4. Linux系统函数之IO函数

    技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.标准C库IO函数工作流程 IO缓冲区的作用? 大部分硬盘都是机械硬盘,读取寻道时间 ...

  5. linux计时函数的使用

    linux计时函数的使用 linux下计时函数的使用目的是测量程序运行的时间 头文件 #include <sys/time.h> 计时函数 int gettimeofday(struct ...

  6. linux C函数之strdup函数分析【转】

    本文转载自:http://blog.csdn.net/tigerjibo/article/details/12784823 linux C函数之strdup函数分析 一.函数分析 1.函数原型: [c ...

  7. Linux getopt()函数 getopt_long()函数---转

    http://hi.baidu.com/scoundrelgg/item/d4083f8412eea05d26ebd97f Linux getopt()函数 getopt_long()函数 get_o ...

  8. php crypt加密 盐值,PHP crypt()函数的用法讲解

    PHP crypt() 函数 定义和用法 crypt() 函数返回使用 DES.Blowfish 或 MD5 算法加密的字符串. 在不同的操作系统上,该函数的行为不同,某些操作系统支持一种以上的算法类 ...

  9. linux shell函数

    linux shell函数

最新文章

  1. ASP.NET 2.0 X64的奇怪问题
  2. leetcode 58. Length of Last Word 题解【C++/Java/Python/JS】
  3. python 调用c++
  4. 各维度 特征 重要程度 随机森林_机器学习算法——随机森林
  5. map传参上下文赋值的问题
  6. 彻底理解Python中的yield
  7. Juniper基础系列之一---vlan的建立
  8. 修改打开方式的程序列表中列出程序的名称
  9. 集成电路查询软件_软件著作权登记的法律意义
  10. 验证邮箱是否合法php,验证邮箱字段是否合法
  11. iOS AnchorPoint 引起的坐标问题
  12. 如何在win10上连接苹果无线键盘
  13. python123星号直角三角形_Python123:星号三角形、凯撒密码
  14. 如何使用Pandas进行数据分析!最详细的数据分析教程!
  15. 从入门到入土:IP源地址欺骗dos攻击实验
  16. 【7.talker.py listener.py】转载自他人作品,相关专业知识咨询相关人员!
  17. 【java】判断一个数是奇数还是偶数
  18. 肺结节目标检测_一种基于CT图像的肺结节检测方法及系统与流程
  19. k线图的93个卖出形态
  20. Java高并发的方式解决

热门文章

  1. 测试人员转型是大势所趋:我的10年自动化测试经验分享
  2. db2locate函数_DB2中使用locate
  3. 机器学习-线性回归实验
  4. 华为上半年手机销量_华为手机份额全球第一,上半年销售收入是多少?
  5. 文件权限管理(chmod用法)
  6. 安卓结构能转换成苹果借口吗_手机上有没有什么便签软件能把图片上的文字转换成文本文档?...
  7. “菩提本无树,明镜亦非台,本来无一物,何处惹尘埃”的出处
  8. 简易版的商品sku表格
  9. Unity脚本与优化
  10. 深度详解 Android 之 Context