.htpasswd 文件示例:

user1:{SHA}kGPaD671VNU0OU5lqLiN/h6Q6ac=

user2:{SHA}npMqPEX3kPQTo+x/+ZckHDrIcQI=

user3:{SHA}q1Fh2LTUjjkncp11m0M9WUH5Zrw=

class Htpasswd {

private $file = '';

private $salt = 'AynlJ2H.74VEfI^BZElc-Vb6G0ezE9a55-Wj';

private function write($pairs = array()) {

$str = '';

foreach ($pairs as $username => $password) {

$str .= "$username:{SHA}$password\n";

}

file_put_contents($this -> file, $str);

}

private function read() {

$pairs = array();

$fh = fopen($this -> file, 'r');

while (!feof($fh)) {

$pair_str = str_replace("\n", '', fgets($fh));

$pair_array = explode(':{SHA}', $pair_str);

if (count($pair_array) == 2) {

$pairs[$pair_array[0]] = $pair_array[1];

}

}

return $pairs;

}

private function getHash($clear_password = '') {

if (!empty($clear_password)) {

return base64_encode(sha1($clear_password, true));

} else {

return false;

}

}

public function __construct($file) {

if (file_exists($file)) {

$this -> file = $file;

} else {

die($file." doesn't exist.");

return false;

}

}

public function addUser($username = '', $clear_password = '') {

if (!empty($username) && !empty($clear_password)) {

$all = $this -> read();

if (!array_key_exists($username, $all)) {

$all[$username] = $this -> getHash($clear_password);

$this -> write($all);

}

} else {

return false;

}

}

public function deleteUser($username = '') {

$all = $this -> read();

if (array_key_exists($username, $all)) {

unset($all[$username]);

$this -> write($all);

} else {

return false;

}

}

public function doesUserExist($username = '') {

$all = $this -> read();

if (array_key_exists($username, $all)) {

return true;

} else {

return false;

}

}

public function getClearPassword($username) {

return strtolower(substr(sha1($username.$this -> salt), 4, 12));

}

}

使用方法

$passwdHandler = new Htpasswd('/home/myuser/.htpasswd');

// Add a user with name 'user1' and password 'I prefer to use passphrase rather than password.' if it doesn't exist in .htpasswd.

$passwdHandler -> addUser('user1', 'I prefer to use passphrase rather than password.');

// Delete the user 'user1' if it exists in .htpasswd.

$passwdHandler -> deleteUser('user1');

// Check if user 'user1' exists in .htpasswd.

if ($passwdHandler -> doesUserExist('user1')) {

// User 'user1' exists.

}

php修改htpasswd,用来解析.htpasswd文件的PHP类相关推荐

  1. 解析HTML文件 - 运用SgmlReader类来解析HTML文件

    运用.NET Framework类来解析HTML文件.读取数据并不是最容易的.虽然你可以用.NET Framework中的许多类(如StreamReader)来逐行解析文件,但XmlReader提供的 ...

  2. C#怎样解析.CSV文件同时把类转换成JSON

    1.首先需要引用 Newtonsoft.Json 目的是为了把对象类直接转换为JSON,返回到前台 using Newtonsoft.Json; 2.定义一个类,存储返回的值 public class ...

  3. 使用jdk DOM,SAX和第三方jar包DOM4J创建,解析xml文件

    xml的创建,解析 1. 什么是xml文件 1.1 什么是xml文件 1.2 解析xml的方式,优缺点 2. 使用dom操作xml文件 2.1 使用dom创建xml文件 2.2 使用dom解析xml文 ...

  4. 第六章、epub文件处理 -- 解析container文件与.opf文件

    2019独角兽企业重金招聘Python工程师标准>>> 第六章.epub文件处理 -- 解析container文件与.opf文件 这一章我们会接着第三章结尾介绍的FBReaderAp ...

  5. java解析Excel文件

    下文介绍java解析Excel文件的方案 前置准备 1.第三方jar包或者Maven配置 org.apache.poi的jar包 Maven配置如下 <groupId>org.apache ...

  6. Android中使用SAX方式解析XML文件

    转载http://blog.csdn.net/cjjky/article/details/6666834 在Android中解析XML文主要有三种方式,分别为Simple API for XML(SA ...

  7. 解析json文件、执行批量修改sql

    要求:解析json文件,取出其中的参数,修改数据库中的数据 数据量:190万条 使用线程池批量处理sql 1.线程: public class DateHandleThread extends Thr ...

  8. [原创工具] 文件MD5批量修改工具及原理解析(附C#源码)

    1.首先告诉大家怎么查看文件的MD5码,命令窗口中输入如下命令: certutil -hashfile 文件名.后缀 MD5 2.原理剖析: 当某个文件的某段数据改变了,哪怕是变了一个字节,那么这个文 ...

  9. 编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出

    写在前面 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与可视化)+Perl/Python等(胶水语言,数据格式转换,软件间衔接)三门语言是一位合格生物信息工程师的标准. 之前分享过 ...

最新文章

  1. spring boot学习资料以及DEMO项目
  2. 飞桨端到端开发套件揭秘:四大秘密武器,让你的开发效率直线提升
  3. maple 假设_Maple常用计算命令..
  4. Codeforces Round #732 (Div. 2) D. AquaMoon and Chess 组合数学 + 找规律
  5. Java 8流中的数据库CRUD操作
  6. Java编程学习并不难,有坚持的动力与良好的心态尤为重要
  7. objective-c 使用NSNumber 将int float long等数据类型加入到数组或字典中
  8. python搭建webapi_怎么搭建Web Api
  9. 以太网接口MII,RMII,SMII,GMII总线接口简介
  10. 实验3-10 高速公路超速处罚 (15 分)
  11. 四十五.加密与解密 AIDE入侵检测系统 扫描与抓包
  12. 关于艾宾浩斯曲线的一点思考
  13. 谷歌浏览器如何安装seleiumIDE插件
  14. 九个完全免费的PPT模板网站
  15. win10计算机怎么改中文,win10系统中文语言的设置方法
  16. 北大青鸟昌平校区 | 学网络运维与安全就业薪资多少?
  17. 定义类MyProgram,包含两个属性:一个是private的整型属性data、一个是private的String类型属性str,重写toString,equals
  18. 使用快照启动 FIBOS、EOS 节点
  19. 第三章 View的基本概念
  20. 微信小程序C语言通讯录,微信小程序のwxml列表渲染

热门文章

  1. python中__init__文件的运用_python中__init__.py文件的作用
  2. python解常微分方程_Python-sympy.dsolve求解常微分方程(组)
  3. oracle表复制为mysql表_oracle 将数据库的表复制到另一个数据库表内
  4. jenkins 手动执行_Jenkins Git client插件命令执行漏洞(CVE201910392)
  5. ios 一直是正在等待审核_iOS开发者账号被调查了,相关问题整理
  6. 【C语言基础】C语言异常捕获机制 - setjmp
  7. java的serversocket_Java ServerSocket 实现聊天室功能(简易版)
  8. php 添加inotify扩展,php inotify 扩展的安装
  9. 使用计算机时 正确的关机顺序是( ),《计算机应用基础》半期考试卷
  10. Python实现简单的学生管理系统