Apache账户密码加密方式介绍
一、apache密码存储格式
apache的用户密码一般会生成保存在.htpasswd文件中,保存路径由用户创建时确定,根据使用加密算法有五种保存格式:
【注】:如果用户指定了保存密码的文件名,视用户指定的文件名而定,默认生成的是.htpasswd文件
1.1 bcrypt
"$2y$" + encrypted
示例:
myName:$2y$05$c4WoMPo3SXsafkva.HHa6uXQZWr7oboPiC2bT/r7q1BB8I2s0BRqC
其中,myNmae表示用户名,$是分割符,无意义;2y是bcrypt加密版本号;05是cost的值;而后的前22位是salt值;再然后的字符串就是密码的密文了。(后面会介绍cost,salt用法)
这里是用crypt_blowfish算法加密得到的结果
【注】:bcrypt是apache2.4以后的版本才引入的加密算法,2.2版本还未支持该算法(实现源码在apr库源文件:crypt_blowfish.c)
1.2 MD5
"$apr1$" + encrypted
示例:myName:$apr1$r31.....$HqJZimcKQFAMYayBlzkrA/
myName是用户名,apr1表示使用的MD5算法,r31......表示创建密码时随机生成的salt,HqJZimcKQFAMYayBlzkrA/是加密后的密文。
这里用的是Apache特定算法,通过使用随机的32位盐和明文密码的各种组合的1000次MD5迭代加密得到的结果。(源码实现在apr库源文件:apr_md5.c)
1.3 SHA1
"{SHA}" + encrypted
示例:myName:{SHA}VBPuJHI7uixaa6LQGWx4s+5GKNE=
myName表示用户名,{SHA}表示采用的SHA-1算法,绿色部分是加密后的结果
这里对密码采用base64-encoded的SHA-1算法进行加密得到的结果(不安全)
1.4 CRYPT
示例:myName:rqXexS6ZhobKA
myName是用户名,rq是salt值,占两个字符,绿色部分是加密后的结果
这里采用标准的unix格式,使用传统的Unix crypt(3)函数,对随机生成的32位盐(仅使用12位)和密码的前8个字符进行加密得到的结果(不安全)
1.5 明文直接保存
明文存储安全系数最低,一般不建议使用明文存储。
apache对密码格式介绍的官方文档可参考:https://httpd.apache.org/docs/2.4/en/misc/password_encryptions.html
(若要获取2.2版本的文档介绍把链接中的2.4改为2.2即可)
二、APR介绍
APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称一样,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。在早期 的Apache版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数。
随着Apache的进一步开发,Apache组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样,APR的开发就从Apache中独立出来,Apache仅仅是使用 APR而已。目前APR主要还是由Apache使用,不过由于APR的较好的移植性,因此一些需要进行移植的C程序也开始使用APR,开源项目比如 Flood loader(http://httpd.apache.org/test/flood/,该项目用于服务器压力测试,不仅仅适用于Apache)、FreeSwitch(www.freeswitch.org),JXTA-C(http://jxta-c.jxta.org,C版本的JXTA点对点平台实现);商业的项目则包括Blogline(http://www.bloglines.com/,covalent(http://www.covalent.net)等等
APR使得平台细节的处理进行下移。对于应用程序而言,它们根本就不需要考虑具体的平台,不管是Unix、Linux还是Window,应用程序执行的接口基本都是统一一致的。因此对于APR而言,可移植性和统一的上层接口是其考虑的一个重点。而APR最早的目的并不是如此,它最早只是希望将Apache中用到的所有代码合并为一个通用的代码库,然而这不是一个正确的策略,因此后来APR改变了其目标。有的时候使用公共代码并不是一件好事,比如如何将一个请求映射到线程或者进程是平台相关的,因此仅仅一个公共的代码库并不能完成这种区分。APR的目标则是希望安全合并所有的能够合并的代码而不需要牺牲性能。
APR的最早的一个目标就是为所有的平台(不是部分)提供一个公共的统一操作函数接口,这是一个非常了不起的目的,当然也是不现实的一个目标。我们不可能支持所有平台的所有特征,因此APR目前只能为大多数平台提供所有的APR特性支持,包括Win32、OS/2、BeOS、Darwin、Linux等等。为了能够实现这个目标,APR开发者必须为那些不能运行于所有平台的特性创建了一系列的特征宏(FEATURE MACROS)以在各个平台之间区分这些特征。这些特征宏定义非常简单,通常用APR_HAS_FEATURE参数设置:
如果某个平台具有这个特性,则该宏必须设置为true,比如Linux和window都具有内存映射文件,同时APR提供了内存映射文件的操作接口,因此在这两个平台上,APR_HAS_MMAP宏必须设置,同时ap_mmap_*函数应该将磁盘文件映射为内存并返回适当的状态码。如果你的操作系统并不支持内存映射,那么APR_HAS_MMAP必须设置为0,而且所有的ap_mmap_*函数也可以不需要定义。第二步就是对于那些在程序中使用了不支持的函数必须提出警告。
目前APR中支持的基本类型包括下面几种:
apache的apr项目目前有三部分组成,分别是apr、apr-util、apr-iconv
- apr中包含了一些通用的开发组件,包括mmap,DSO等等,
- apr-util该目录中也是包含了一些常用的开发组件。这些组件与apr目录下的相比,它们与apache的关系更加密切一些。比如存储段和存储段组,加密等等。
- apr-iconv包中的文件主要用于实现iconv编码。目前的大部分编码转换过程都是与本地编码相关的。在进行转换之前必须能够正确地设置本地编码。因此假如两个非本地编码A和B需要转换,则转换过程大致为A->Local以及Local->B或者B->Local以及Local->A。
三、实现原理
实现的原理跟Linux下弱口令检测类似,只是由于apache的加密方法是在基于标准的加密算法上加入了自己特有的处理的,所以不能直接用linux下的加解密接口来解决此问题,在httpd的源码中我们发现他们提供了一个专门做验证的接口apr_password_validate(),该接口说明如下:
所以我们可以调用该接口进行验证,而该接口依赖于apr和apr-util
【注】:crypt加密算法的验证需要在支持crypt(3)函数的机器上才能用
3.1 下载安装apr和apr-util
1.先去官网(http://apr.apache.org/download.cgi)下载安装包,或者用现成下好的也可以
2.apr安装:
# gzip -d apr-1.5.4.tar.gz
# tar xvf apr-1.5.4.tar
# cd apr-1.5.4
# ./configure --prefix=/opt/apr
./configure --prefix=/opt/apr
make && make install
3.apr-util安装:
# gzip -d apr-util-1.5.2.tar.gz
# tar xvf apr-util-1.5.2.tar
# cd apr-util-1.5.2
# ./configure --prefix=/opt/apr-util --with-apr=/opt/apr
# make && make install
3.2 链接apr和apr-util库
调用apr库中接口apr_password_validate()实现一个demo,这里只需传入密码明文和密码字符串(用户名后的所有部分,包括id,salt和encrypted),若相等,则返回0,否则返回1。
接口:
apache_password_validate(const char *passwd, const char *hash);
输入:
passwd 明文弱口令
hash 密码文件中读取的字符串
输出:
若相等,则返回0
不相等,返回1
使用示例代码:
const char *hash = "$2y$05$GNaiLiVSH3qRBLzLNxw6oO2mZya3JqAyKfbeTIxcq6SFNZ2r.KG7.";
printf("bcrypt validate result = %d\n",apache_password_validate(“123456”, hash));
Apache账户密码加密方式介绍的更多相关文章
- 无线网络(WLAN)常见加密方式介绍
在使用无线路由器配置wifi安全设定的时候经常会遇到各种加密方式,即不懂意思也不知道如何选择.本文将对此做一个简单的介绍. 1.WEP 有线等效协议(Wired Equivalent Privacy, ...
- java常见加密方式介绍
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt260 本篇内容简要介绍BASE64.MD5.SHA.HMAC几种加密算法. ...
- 无线网卡加密方式wep wpa/wpa2 介绍
常见无线热点的配置选项:无线名称路由器的无线(Wi-Fi)名称.无线密码无线加密使用WPA2-PSK/WPA-PSK加密方式.AES加密算法,无线密码为8-63个字符,最好是数字.字母.符号的组合.信 ...
- [转]Apache HTTP Server 与 Tomcat 的三种连接方式介绍
首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接.事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端 ...
- Apache shiro的简单介绍与使用(与spring整合使用)
apache shiro框架简介 Apache Shiro是一个强大而灵活的开源安全框架,它能够干净利落地处理身份认证,授权,企业会话管理和加密.现在,使用Apache Shiro的人越来越多,因为它 ...
- Apache shiro的简单介绍与使用(与spring整合使用,并加入ehcache缓存权限数据)
apache shiro框架简介 Apache Shiro是一个强大而灵活的开源安全框架,它能够干净利落地处理身份认证,授权,企业会话管理和加密.现在,使用Apache Shiro的人越来越多,因为它 ...
- Java中常用的加密方式(附多个工具类)
一.Java常用加密方式 Base64加密算法(编码方式) MD5加密(消息摘要算法,验证信息完整性) 对称加密算法 非对称加密算法 数字签名算法 数字证书 二.分类按加密算法是否需要key被分为两类 ...
- When I see you again(加密原理介绍,代码实现DES、AES、RSA、Base64、MD5)
关于网络安全的数据加密部分,本来打算总结一篇博客搞定,没想到东西太多,这已是第三篇了,而且这篇写了多次,熬了多次夜,真是again and again.起个名字:数据加密三部曲,前两部链接如下: 整体 ...
- Spark部署三种方式介绍:YARN模式、Standalone模式、HA模式
参考自:Spark部署三种方式介绍:YARN模式.Standalone模式.HA模式http://www.aboutyun.com/forum.php?mod=viewthread&tid=7 ...
随机推荐
- stf-多设备管理平台搭建
项目地址: https://github.com/openstf/stf 安装.使用命令 # 安装stfbrew install rethinkdb graphicsmagick zeromq pro ...
- hdu6704 2019CCPC网络选拔赛1003 K-th occurrence 后缀自动机+线段树合并
解题思路: fail树上用权值线段树合并求right/endpos集合,再用倍增找到待查询串对应节点,然后权值线段树求第k大. #include<bits/stdc++.h> using ...
- Johnson全源最短路
例题:P5905 [模板]Johnson 全源最短路 首先考虑求全源最短路的几种方法: Floyd:时间复杂度\(O(n^3)\),可以处理负权边,但不能处理负环,而且速度很慢. Bellman-Fo ...
- 最详细不过的CUDA的下载安装使用、环境变量配置,有这一篇就够了
在上一期中,我们介绍了为什么使用GPU可以加速计算和处理图像,以及查看自己的电脑能否使用GPU加速,不知道的可以去看上一期文章,这期我们正式的来下载与安装GPU加速工具CUDA,并检查是否安装成功. ...
- 烂大街的 Spring 循环依赖问题,你觉得自己会了吗
文章已收录在 GitHub JavaKeeper ,N 线互联网开发.面试必备技能兵器谱,笔记自取. 微信搜「 JavaKeeper 」程序员成长充电站,互联网技术武道场.无套路领取 500+ 本电子 ...
- leetcode刷题-90子集 II
题目 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2]输出:[ [2], [1], [1,2,2], [ ...
- Maven是什么? Maven的概念+作用+仓库的介绍+常用命令
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型.一组标准集合,一个依赖管理系统.和用来运行定义在生命周期阶段中插件目标和逻辑. 核心功能 Maven的核心 ...
- elasticsearch跨集群数据迁移
写这篇文章,主要是目前公司要把ES从2.4.1升级到最新版本7.8,不过现在是7.9了,官方的文档:https://www.elastic.co/guide/en/elasticsearch/refe ...
- 我是如何使用freemarker生成Word文件的?
推荐:亲身体验,数次踩坑,遂撰写此文,以备各位不时之需. 背景 一天,产品经理递给我了一份word报告,我定睛一看 这个文档有大大小小的标题层级,还有排版好的段落.各种一目了然的饼图.走势图,当然还少 ...
- HTTP协议(二)---请求和响应
HTTP通过请求和响应的交换达成通信. HTTP请求 请求报文由请求行(请求方法.请求URI.协议版本).请求首部字段以及内容实体(可能没有)构成. 下面是一个GET请求,没有内容实体: 下面是 一个 ...