本文目录导读:

- 目录导读
- 为什么你需要一个“密码本工具”?
- PHP CLI模式:命令行工具的天然之选
- 核心功能设计:加密、存储与检索
- 实战代码:从零构建你的密码管理器
- 安全加固:防暴力破解与主密码策略
- SEO高频问答(FAQ)
- 让密码管理回归极客精神
**
《终端安全利器:用PHP打造你的专属密码本命令行工具(全攻略)》
目录导读
- 为什么你需要一个“密码本工具”?
- PHP CLI模式:命令行工具的天然之选
- 核心功能设计:加密、存储与检索
- 实战代码:从零构建你的密码管理器
- 安全加固:防暴力破解与主密码策略
- SEO高频问答(FAQ)
- 让密码管理回归极客精神
为什么你需要一个“密码本工具”?
在浏览器自动填充、云同步密码库盛行的时代,很多人忽略了本地化、离线、可控的重要性,云服务可能被拖库,浏览器插件可能被恶意注入,而一个基于PHP的命令行密码本,可以让你在SSH登录服务器后,无需任何图形界面,直接用php passbook.php命令,快速查询、添加、更新密码,它尤其适合运维工程师、独立开发者以及极客用户——数据永远只躺在你的硬盘里,加密密钥只存在于你的脑中。
PHP CLI模式:命令行工具的天然之选
PHP不仅用于Web开发,其CLI(命令行接口)模式同样强大,优势在于:
- 零依赖:几乎每台Linux服务器都预装PHP。
- 语法友好:相比C/C++,PHP处理数组、JSON、文件操作更简洁。
- 内置OpenSSL扩展:轻松实现AES-256-CBC加密。
关键概念:php -r "echo 'hello';" 可直接执行单行代码,而构建完整工具时,我们使用Shebang(#!/usr/bin/env php)让脚本可执行。
核心功能设计:加密、存储与检索
一个合格的密码本需具备:
- 主密码:用于派生加密密钥(推荐使用
hash_pbkdf2,迭代10万次以上)。 - 加密存储:将密码记录保存为JSON文件,字段加密后写入。
- 操作命令:
add(添加)、get(查询)、list(列出服务名)、del(删除)。 - 剪贴板交互:通过
xclip或pbcopy将密码直接复制(macOS/Linux)。
防偷窥设计:使用 stty -echo 隐藏输入,避免终端记录历史命令。
实战代码:从零构建你的密码管理器
以下为精简核心代码(完整版可扩展至300+行):
#!/usr/bin/env php
<?php
// passbook.php
$dataFile = 'vault.dat'; // 加密后的数据文件
$salt = 's3cure_s@lt'; // 固定盐(生产环境用随机盐)
// 读取主密码
echo "Enter master password: ";
system('stty -echo');
$master = trim(fgets(STDIN));
system('stty echo');
// 派生密钥(AES-256-CBC)
$key = hash_pbkdf2('sha256', $master, $salt, 100000, 32, true);
// 解密现有数据
function decryptData($file, $key) {
if (!file_exists($file)) return [];
$content = file_get_contents($file);
$iv = substr($content, 0, 16);
$cipher = substr($content, 16);
$json = openssl_decrypt($cipher, 'aes-256-cbc', $key, 0, $iv);
return json_decode($json, true);
}
// 加密保存
function encryptData($data, $key, $file) {
$json = json_encode($data);
$iv = random_bytes(16);
$cipher = openssl_encrypt($json, 'aes-256-cbc', $key, 0, $iv);
file_put_contents($file, $iv . $cipher);
}
// 处理命令
$action = $argv[1] ?? 'list';
$data = decryptData($dataFile, $key);
switch ($action) {
case 'add':
$service = $argv[2];
echo "Password for $service: ";
system('stty -echo');
$pwd = trim(fgets(STDIN));
system('stty echo');
$data[$service] = $pwd;
encryptData($data, $key, $dataFile);
echo "[OK] Added/Updated $service\n";
break;
case 'get':
$service = $argv[2];
if (isset($data[$service])) {
// 复制到剪贴板
exec("echo " . escapeshellarg($data[$service]) . " | pbcopy"); // macOS
echo "[OK] Password for $service copied to clipboard.\n";
} else echo "[!] Not found.\n";
break;
case 'list':
echo "Stored services:\n";
foreach ($data as $s => $p) echo " - $s\n";
break;
case 'del':
unset($data[$argv[2]]);
encryptData($data, $key, $dataFile);
echo "[OK] Deleted.\n";
break;
default:
echo "Usage: php passbook.php [add|get|list|del] [service]\n";
}
运行截图模拟:
$ php passbook.php add github
Enter master password: ********
Password for github: ********
[OK] Added/Updated github
安全加固:防暴力破解与主密码策略
- 使用随机盐:将
$salt改为每次初始化时生成的随机值,存储在单独文件中。 - 锁定机制:连续输错5次主密码,锁定程序10分钟(记录失败时间戳)。
- 内存清理:使用
unset($key, $master)及时释放变量,防止核心转储泄露。 - 权限配置:
chmod 700 passbook.php vault.dat,仅限本用户读写。
主密码建议:至少12位,混合大小写、数字、符号,不要与任何网站密码重复。
SEO高频问答(FAQ)
Q1:PHP命令行工具是否需要在Web服务器上运行?
不需要,只要本地装有PHP CLI即可(php -v查看版本),完全离线操作,不依赖Nginx/Apache。
Q2:数据文件被删了怎么恢复?
无解,所以建议定期备份 vault.dat 文件到U盘或加密云盘(但注意备份时主密码强度决定安全)。
Q3:相比KeePass、LastPass有什么优势?
优势在于可脚本化:你可以写Shell脚本循环调用 php passbook.php get server_password 来配置SSH密钥、数据库密码,实现基础设施自动化。
Q4:如何迁移到另一台服务器?
直接复制 passbook.php + vault.dat 即可,无需安装其他依赖,这是PHP最友好的地方。
Q5:可以用在Windows上吗?
可以,安装PHP for Windows,并调整剪贴板命令为 clip。
让密码管理回归极客精神
这个工具虽然简单,但体现了Unix哲学:每个程序专注做好一件事,通过PHP CLI,你拥有的不仅是一个密码管理器,更是一个可嵌入任何自动化脚本的接口,无论是服务器运维、爬虫调度还是个人记账,你都可以用同一个主密码保护所有敏感信息,最后提醒:代码请务必加入单元测试,并在生产环境使用前进行完整备份演练。
(文章结束,未包含字数统计)