body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

#include<stdio.h>
#include<unistd.h>
#include<shadow.h>
#include<string.h>
#include<stdlib.h>
void get_salt(char *salt,char *passwd)
{
        int i,j;
        for(i=0,j=0;passwd[i]&&j!=3;++i) //i=11的时候passwd[i]=='$',出for循环的时候i=12
        {
                if(passwd[i]=='$')
                        j++;
        }
        strncpy(salt,passwd,i-1);   //ncpy拷贝i个,源代码写的循环是<n
}
int main()
{
        struct spwd *sp;
        char *passwd;
        char *name;
        char salt[512]={0};
        //获得输入的用户名和密码;
        //char *getpass(const char *prompt);   //函数原型
        name = getpass("please input usrname:");
        passwd = getpass("please input passwd:");
        //struct spwd *getspnam(const char *name);   //函数原型
        sp = getspnam(name); 
        if(NULL==sp)
        {
                perror("getspnam");
                return -1;
        }
        get_salt(salt,sp->sp_pwdp);    //通过加密后的字符串,取出id和salt字符串
        printf("%s\n",salt);
        //char *crypt(const char *key, const char *salt);
        if( ( strcmp(sp->sp_pwdp,crypt(passwd,salt)) )==0)
                printf("success!\n");
        else
                printf("fail!\n");
        return 0;
}

//linux密码验证

cat /etc/shadow   
meihao:$1$qDku/Q8E$tfeCg6yg8D3bZ8hzk8V2y/:17354:0:99999:7:::
对于linux的登陆验证我想大家可能都知道是将输入的密码进行相应编码加密后与/etc/shadow文件中对应的密码部分进行比较,如果相同则验证通过,如果不同则表明密码错误,但是问题是我们要如何将用户输入的密码加密然后进行比较。
为了提高安全性,Linux引入了salt,所谓salt即为一个随机数,引入的时候为一个12bit的数值,当用户设置密码时,会随机生成一个salt与用户的密码一起加密,得到一个加密的字符串(salt以明文形式包含在该字符中),存储到密码文件中。crypt函数可以将用户输入的密码和salt一起适应某种算法进行加密,该加密后的字符串就是我们需要的与密码文件中密码对比的加密字符串。
crypt为支持不同的方式将salt格式化为
$id$salt$encode
其中id代表不同的算法
              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)   当前我们Linux采用的加密算法
这样我们就可以利用crypt函数将用户输入的字符加密,然后与密码文件中的密码进行对比了,有一个函数getspnam可以根据用户名从/etc/shadow中得到密码,函数返回的数据结构
struct spwd {
               char *sp_namp;     /* Login name */
               char *sp_pwdp;     /* Encrypted password */
               long  sp_lstchg;   /* Date of last change (measured
                                     in days since 1970-01-01 00:00:00 +0000 (UTC)) */
               long  sp_min;      /* Min # of days between changes */
               long  sp_max;      /* Max # of days between changes */
               long  sp_warn;     /* # of days before password expires
                                     to warn user to change it */
               long  sp_inact;    /* # of days after password expires
                                     until account is disabled */
               long  sp_expire;   /* Date when account expires (measured
                                     in days since 1970-01-01 00:00:00 +0000 (UTC)) */
               unsigned long sp_flag;  /* Reserved */
           };
我们现在创建一个test用户,并将密码设置为1234来做个测试看一下
这是创建之后从/etc/shadow中取出来的密码部分
$6$qOrvsN41$gGlv8z7P1sAKuyaTAY03AvCn9/Z6Ygc4DJ9Uwe0RVzNAI6TQsTfsdihPnIh3lSZV2C02HjW.9bvJNdep3k.ER.
可以看到这里的salt为$6$qOrvsN41

crypt函数加密验证的更多相关文章

  1. Android逆向之旅---基于对so中的函数加密技术实现so加固

    一.前言 今天我们继续来介绍so加固方式,在前面一篇文章中我们介绍了对so中指定的段(section)进行加密来实现对so加固 http://blog.csdn.net/jiangwei0910410 ...

  2. PHP crypt() 函数

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

  3. 爆破一个二元函数加密的cm

    系统 : Windows xp 程序 : cztria~1 程序下载地址 :http://pan.baidu.com/s/1slUwmVr 要求 : 爆破 使用工具 : OD 可在看雪论坛中查找关于此 ...

  4. Linux kernel ‘aac_send_raw_srb’函数输入验证漏洞

    漏洞名称: Linux kernel ‘aac_send_raw_srb’函数输入验证漏洞 CNNVD编号: CNNVD-201311-422 发布时间: 2013-11-29 更新时间: 2013- ...

  5. java与.net平台之间进行RSA加密验证

    RSA加密算法虽然不分平台,标准都是一样的,但是各个平台的实现方式都不尽相同,下面来我来说说java与.net平台之间该如何进行RSA加密验证,即java端加密->.net端验证和.net端加密 ...

  6. Monkey ‘mk_request_header_process’函数输入验证漏洞

    漏洞名称: Monkey ‘mk_request_header_process’函数输入验证漏洞 CNNVD编号: CNNVD-201308-003 发布时间: 2013-08-22 更新时间: 20 ...

  7. linux crypt()函数使用总结

    原型: char *crypt(const char *key, const char *salt); 标准说明: crypt()算法会接受一个最长可达8字符的密钥(即key),并施以数据加密算法(D ...

  8. flask 在视图函数中验证表单

    在视图函数中验证表单 因为现在的basic_form视图同时接受两种类型的请求:GET请求和POST请求.所以我们要根据请求方法的不同执行不同的代码.具体来说,首先是实例化表单,如果是GET请求,就渲 ...

  9. [PHP] 内部接口简单加密验证方式

    1. 当有内部系统之间进行调用的时候,也需要简单的进行一下调用方的验证,一种简单的内部接口加密验证方式.此加密方式需要三个参数,分别是api地址,pin码,entry标识,其中pin和entry是接口 ...

随机推荐

  1. android整理的一些基础知识

    本篇文章内容大部分是来源于本人实际开发中的心得总结,不是非常全面,咱才疏学浅,如果有错误的地方恳请各位指出哦~ android四大组件 四大组件包括:Activity(活动),Service(服务), ...

  2. cocos2d: fullPathForFilename: No file found at /cc_2x2_white_image. Possible missing file.

    程序运行的时候输出这条信息cocos2d: fullPathForFilename: No file found at /cc_2x2_white_image. Possible missing fi ...

  3. 简单地理解HTTPS 转

    原文地址:http://www.nowamagic.net/librarys/veda/detail/2394 我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等 ...

  4. Django---ModelForm详解

    示例: from django.db import models from django.forms import ModelForm TITLE_CHOICES = ( ('MR', 'Mr.'), ...

  5. 巨坑:jqgrid竟然取不到编辑模式下input的值

    今天遇到最奇葩的问题,竟然取不到input的值,感觉世界观都颠覆了.后来一搜资料,又是jqgrid框架搞的鬼,真搞不明白,开发框架就好好开发框架,留这么多坑有意思吗? jqgrid编辑模式下不要调用g ...

  6. 20145331《Java程序设计》第5周学习总结

    20145331<Java程序设计>第5周学习总结 教材学习内容总结 第八章 概述 Java异常机制主要依赖于try.catch.finally.throw.throws五个关键字. 语法 ...

  7. Excel水平线画不直,图形对象对不齐,怎么办

    看够了千篇一律的数字报表,不妨添加些图形对象来调剂下,今天小编excel小课堂(ID:excel-xiaoketang 长按复制)给各位分享10个插入图形对象时简单实用的小技巧. 01课题 今天小编e ...

  8. c++ 使用WinHTTP实现文件下载功能

    因为要项目中要想要实现一个软件自动更新的功能,之前是使用socket直接下载.但切换下载源的时候很麻烦.所以换用http方式. 网上找了很多资料,基本上就是下面几种: 1.curllib //功能强大 ...

  9. 使用BusyBox制作根文件系统

    1.BusyBox简介 BusyBox 是很多标准 Linux 工具的一个单个可执行实现.BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大.更复杂的工具,例如 gre ...

  10. 【bzoj5177】[Jsoi2013]贪心的导游(分块)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5177 在网上看到的题解基本都是用主席树,也就是带点骚操作的暴力直接艹过去的.这里分享一 ...