简介

Basic Auth用于服务端简单的登录认证,通常使用服务器Nginx、Apache本身即可完成。比如我们要限定某个域名或者页面必须输入用户名、密码才能登录,但又不想使用后端开发语言,此时Basic Auth就派上用场了。

Basic Auth 使用htpasswd工具进行生成 http 基本认证的密码文件。

流程

首先说一下Basic Auth使用流程。

创建认证文件

新建一个文件auth_basic_user_file,例如:

  1. # 创建目录
  2. sudo mkdir -p /usr/local/nginx/
  3. # 生成文件
  4. sudo touch /work/yphp/nginx/nginx-htpasswd

文件名就是nginx-htpasswd

生成密码

使用htpasswd工具生成密码文件:

  1. # 安装htpasswd
  2. sudo apt-get install apache2-utils
  3. # 生成密码
  4. sudo htpasswd -c -d /work/yphp/nginx/nginx-htpasswd yujc
  5. New password:
  6. Re-type new password:
  7. Adding password for user yujc
  8. # 查看文件内容
  9. cat //work/yphp/nginx/nginx-htpasswd
  10. yujc:sBoB9G5lTLvPk

这里解释说明一下:

htpasswd 是开源 http 服务器 apache httpd 的一个命令工具,所以本机如果没有该命令,需要先安装。

htpasswd 命令最后一个参数是用户名,也就是需要登录的用户名。命令运行后,会要求输入该用户登录时的密码,这里我输入了123。最终我们发现会往/work/yphp/nginx/nginx-htpasswd文件添加了一行内容。

其中冒号前面的就是用户名,后面是加密的密码。

如果没有htpasswd工具怎么办呢?也可以借助在线的工具生成:http://tool.oschina.net/htpasswd 。加密方式选择crypt。点击生成后,把生成结果追加到nginx-htpasswd文件里即可:

  1. cat /work/yphp/nginx/nginx-htpasswd
  2. yujc:sBoB9G5lTLvPk
  3. yujc2:RF8ulInobr21M

大家会发现,相同的密码,每次生成的结果都不一样,没关系,只要密码没变,最终都能登录的。原因在后面再说明。

Nginx配置Basic Auth

  1. server {
  2. listen 80;
  3. server_name test.com;
  4. auth_basic "登录认证";
  5. auth_basic_user_file /work/yphp/nginx/nginx-htpasswd;
  6. root /mnt/html/www;
  7. index index.html index.php;
  8. }

重启Nginx服务后,访问test.com 就会要求输入用户名、密码。

备注:一定要注意auth_basic_user_file路径,如果文件不存在,会不厌其烦的出现403。

如果只想某一个页面支持Basic Auth,可以将auth_basic配置到location里:

  1. location /test {
  2. auth_basic "登录认证";
  3. auth_basic_user_file /work/yphp/nginx/nginx-htpasswd;
  4. }

htpasswd加密方式

  • MD5:使用MD5加密密码。在Windows, Netware 和TPF上,这是默认的加密方式。

  • crypt:使用crypt()加密密码。在除了Windows, Netware和TPF的平台上,这是默认的。 虽然它在所有平台上可以为htpasswd所支持, 但是在Windows, Netware和TPF上不能为httpd服务器所支持。

  • SHA:使用SHA加密密码。 它是为了方便转入或移植到使用LDAP Directory Interchange Format (ldif)的Netscape而设计的。

  • plain:不加密,使用纯文本的密码。虽然在所有平台上 htpasswd 都可以建立这样的密码, 但是httpd后台只在Windows, Netware和TPF上支持纯文本的密码。

通常我们使用crypt加密方式。如果你使用PHP语言,内置的crypt()函数即可实现加密。

crypt

crypt() 返回一个基于标准 UNIX DES 算法或系统上其他可用的替代算法的散列字符串。

这里以PHP的crypt为例子说明。该函数原型:

  1. string crypt ( string $str [, string $salt ] )

salt 参数是可选的。然而,如果没有salt的话,crypt()创建出来的会是弱密码。 php 5.6及之后的版本会在没有它的情况下抛出一个 E_NOTICE 级别的错误。为了更好的安全性,请确保指定一个足够强度的盐值。

我们使用该函数生成密码的hash值,使用不同的salt值:

  1. php > echo crypt("123", "123456");
  2. 12IbR.gJ8wcpc
  3. php > echo crypt("123", "abcde");
  4. abLEFxdWWYR3c

然后复制到/work/yphp/nginx/nginx-htpasswd

  1. #yujc:sBoB9G5lTLvPk
  2. yujc2:12IbR.gJ8wcpc
  3. yujc3:abLEFxdWWYR3c

输入123均能登录成功。

注意:测试新用户需要将已登录用户注释掉,无需重启nginx。

为什么验证的时候我们并没有告诉nginx的salt是多少,但是还能验证?为什么同一密码不同salt产生的hash都能验证?

我们看下面的例子:

  1. $ php -a
  2. Interactive mode enabled
  3. php > echo crypt("123", "12IbR.gJ8wcpc");
  4. 12IbR.gJ8wcpc
  5. php > echo crypt("123", "abLEFxdWWYR3c");
  6. abLEFxdWWYR3c
  7. php > echo crypt("123", "12test");
  8. 12IbR.gJ8wcpc

大家应该发现了什么。我们把加密后的hash当做salt再次使用crypt函数,生成的hash竟然与传入的salt相同。然后我们把salt前2位保持不变,后面的改成其他的,再使用crypt函数,生成的hash没有变化。这说明crypt函数只与salt的前几位有关系:只要前几位不变,生成的hash是一样的。

我们既没有指定使用的算法,也没有指定盐值,crypt是怎么知道使用什么算法和盐值的呢?其实crypt是根据$salt参数来判断使用哪种哈希算法。也就是说,$salt本身就包含了算法的类型以及哈希时实际用到盐值。

实际使用的算法判断有下面这几种情况:

  • 标准DES(Standard DES)

    在没有匹配到其他算法的情况下,则使用标准DES算法,此时取前两个字符为盐值(不足两个字符则返回*0)。盐值的字符必须是./0-9A-Za-z里的字符。
  1. php > echo crypt("123", "t123");
  2. t1ZzgDe4z3qWE
  3. php > echo crypt("123", "123");
  4. 12IbR.gJ8wcpc
  5. php > echo crypt("123", "t");
  6. *0
  • 扩展DES(Extended DES)

    以下划线_开头,后面紧接着4字节的迭代次数和4字节的盐值。也就是取前9位,后面是什么值无所谓。
  1. php > echo crypt("123", "_12345678");
  2. _12345678VaI36zUn7Jk
  3. php > echo crypt("123", "_12345678t");
  4. _12345678VaI36zUn7Jk
  5. php > echo crypt("123", "_testtest");
  6. _testtest4v7fH1Er0Ng
  7. php > echo crypt("123", "_testtest1");
  8. _testtest4v7fH1Er0Ng
  • MD5

    $1$开头,然后是12个字符以内的盐值。只要前12位相同,生成的hash相同。
  1. php > echo crypt("123", '$1$');
  2. $1$$GmbL3iXOMZR57QuGDLv.L1
  3. php > echo crypt("123", '$1$2');
  4. $1$2$WOzAAwhejT62wplMg6rEE1
  5. php > echo crypt("123", '$1$23');
  6. $1$23$0ZjnChzzaj90xZQJQKHFS1
  7. php > echo crypt("123", '$1$123456789');
  8. $1$12345678$tRy4cXc3kmcfRZVj4iFXr/
  9. php > echo crypt("123", '$1$1234567890');
  10. $1$12345678$tRy4cXc3kmcfRZVj4iFXr/

注意:PHP里双引号里面的字符串如果包含$会被认为是变量。

  • lowfish

    $2a$$2x$或者$2y$开头,然后是用于cost参数的两位数字,紧接着一个$字符,最后是22位./0-9A-Za-z范围里的字符。
  1. php > echo crypt("123", '$2a$07$usesomesillystringforsalt$');
  2. $2a$07$usesomesillystringforeN7/2NBfGxbAuv02IPrTFBImFJd5PJ1m
  3. php > echo crypt("123", '$2a$07$usesomesillystringforsalt$1');
  4. $2a$07$usesomesillystringforeN7/2NBfGxbAuv02IPrTFBImFJd5PJ1m

使用这个算法的时候,$str最长支持72个字符,超过会被截掉。

  • SHA256

    $5$开头,然后是16个字符的盐值,盐值之前还可以使用rounds=$的格式表明哈希的循环次数(N)。
  1. php > echo crypt("123", '$5$rounds=5000$usesomesillystringforsalt$');
  2. $5$rounds=5000$usesomesillystri$BYJncGl82VuZ6T61c4wSpXT.xoDSuz9aF4JyE9F08U4

rounds的默认值为5000,范围是1000到999,999,999,如果N不在这个范围里,会被截取到最接近的范围里。

  • SHA512

    $6$开头,然后是16个字符的盐值,盐值之前还可以使用rounds=$的格式表明哈希的循环次数(N)。
  1. php > echo crypt("123", '$6$rounds=5000$usesomesillystringforsalt$');
  2. $6$rounds=5000$usesomesillystri$YPNvueKNHmPrzbloaqIomo1gPrVo8aLnqwrKlhlfThu2wzo73efrh/FCR4CAUf/GFe7gF6vuLWTMyFNb7jfnT1

rounds的默认值为5000,范围是1000到999,999,999,如果N不在这个范围里,会被截取到最接近的范围里。

PHP里我们使用crypt函数,salt直接传第一个参数的base64_encode即可:

  1. $hashed_password = crypt ( 'mypassword', base64_encode('mypassword') );

参考

1、Nginx配置Basic Auth登录认证 - 简书

https://www.jianshu.com/p/b4a78af4e266

2、PHP笔记 —— crypt方法 - 个人文章 - SegmentFault 思否

https://segmentfault.com/a/1190000009219416

3、PHP: crypt - Manual

http://php.net/manual/zh/function.crypt.php

使用crypt配置Basic Auth登录认证的更多相关文章

  1. 接口开发---basic auth接口认证

    开发中遇到了basic auth来认证的案例,这里总结一下: Basic Auth简单点说明就是每次请求API时都提供用户的username和password.[base64encode(userna ...

  2. Django之auth登录认证

    前言:我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Django作为一个完美主义者的 ...

  3. SANGFOR AC配置AD域单点登录(二)----AD域侧配置及单点登录认证、注销测试

    1.AD域侧配置 1)新建组策略并配置logon登录脚本,以实现用户开机登录域时,自动通过AC认证  AD域服务器"运行"输入gpmc.msc,打开组策略编辑器,如下图. 右建需要 ...

  4. 精讲RestTemplate第9篇-如何通过HTTP Basic Auth认证

    本文是精讲RestTemplate第9篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层H ...

  5. 如何在思科交换机上配置Telnet远程登录

    本地用户认证登录 如果配置本地用户认证,则需要开启本地数据库认证,这时就不需要配置相应虚拟终端认证密码了,但要至少配置一个本地用户并设置用户密码用来进行登录认证,具体配置如下: C2960#conf ...

  6. Etcd安全配置之Basic Auth认证

    <中小团队落地配置中心详解>文章中我们介绍了如何基于Etcd+Confd构建配置中心,最后提到Etcd的安全问题时说了可以使用账号密码认证以达到安全访问的目的,究竟该如何开启认证以及怎么设 ...

  7. Nginx下配置Http Basic Auth

       nginx basic auth指令 第一条语句: 语法:     auth_basic string | off;默认值:     auth_basic off;配置段:     http, ...

  8. (74)zabbix第三方认证之http(nginx basic auth)

    HTTP Basic Auth认证方式,我们将在实例中使用nginx来演示,Apache也类似. zabbix认证配置 Administration>> Authentication,将h ...

  9. Nginx 配置 Basic 认证

    /* * 环境:LNMP(CentOS 6.6 + Nginx 1.8.0) */ 在 Nginx 下配置 Basic 认证需要依靠 Nginx 的 http_auth_basic_module 模块 ...

随机推荐

  1. Python项目--Scrapy框架(一)

    环境 win8, python3.7, pycharm 正文 1.Scrapy框架的安装 在cmd命令行窗口执行: pip install Scrapy 即可完成Scrapy框架的安装 2. 创建Sc ...

  2. Linux Curl命令

    一.简介 linux curl是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称url为下载工具.   二.安装 wget http://c ...

  3. MySQL优化(四) 慢查询的定位及优化

    一.SQL语句优化的一般步骤: (1)通过 show status 命令了解各种 SQL 的执行效率: (2)定位执行效率较低的 SQL 语句(重点是 Select): (3)通过 explain 分 ...

  4. Hbase 性能改进

    第一种性能改进方式:

  5. java29

    1.封装小练习--长方形 创建长方形类 使用getset方法 利用返回值方法计算长方形的面积,周长. 保证长方形的长宽为整数 2.继承小练习--猫狗 当父类中有构造器时,子类也要有构造器,并且要求设置 ...

  6. Spring的介绍与搭建

    一.Spring的介绍 二.Spring的搭建 (1)导包 (2)创建一个对象 (3)书写配置注册对象到容器 (4)代码测试

  7. v$lockv和$locked_object的区别

    v$lockv和$locked_object的区别 url: http://blog.sina.com.cn/s/blog_62defbef0101pgvo.html 2013-12-24 v1.0 ...

  8. sql server常用字符串函数

    --返回字符表达式中最左侧字符的ASCII代码值 --将整数ASCII代码转换为字符 )--a )--A ')--A SELECT CHAR('A')--在将 varchar 值 'A' 转换成数据类 ...

  9. 源码解读Linux的limits.conf文件

    目录 目录 1 1. 前言 1 2. PAM 2 3. pam_limits 2 4. limits.conf的由来 3 5. 模块入口函数 4 6. 解析limits.conf 6 7. 生效lim ...

  10. java技术突破要点

    一.源码分析 源码分析是一种临界知识,掌握了这种临界知识,能不变应万变,源码分析对于很多人来说很枯燥,生涩难懂. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 我认为是阅读源码的最核心 ...