當前位置: 首頁> 最新文章列表> 使用crypt() 構建命令行用戶驗證工具

使用crypt() 構建命令行用戶驗證工具

M66 2025-05-21

在日常的系統管理或開發流程中,我們有時需要一個簡單的用戶驗證機制,尤其是在構建命令行工具時。雖然生產環境中我們更傾向於使用OAuth、JWT 或數據庫認證機制,但在某些輕量級場景下,一個基於crypt()函數的用戶驗證工具就足夠了。

本文將帶你一步一步構建一個基於crypt()的PHP 命令行用戶驗證工具。

一、了解crypt()函數

crypt()是PHP 內置的加密函數,用於對密碼進行單向哈希加密。它可以使用不同的算法(如DES、MD5、SHA-256、SHA-512),取決於提供的salt 格式。

示例:

 $password = 'secret123';
$hashed = crypt($password, '$6$rounds=5000$mysalt$'); // 使用 SHA-512 加密
echo $hashed;

二、構建用戶密碼文件

我們需要先定義一個用戶密碼文件,類似於Linux 的/etc/shadow ,用於存儲用戶名和對應的加密密碼。

例如,創建users.txt文件,內容如下:

 alice:$6$rounds=5000$randomsalt$TtXcNpEYgkQq6nGyTT1ZqJK6sOHZ7GUa0OtUzBDwK8DUD.QHrVmMTE6EKH9vdA/5jYrc6IQsb9M4OzhxZs7Hz1
bob:$6$rounds=5000$othersalt$z1MBfFaSzPIcL7PZ8coYumWqaYvKPWhjvOwwBQ25BqNjfGC2THcR2A2E2MBc6m/mM6z2qKNEqgghADnIJo7KO0

三、編寫驗證腳本

創建auth.php文件:

 <?php
// 檢查是否從命令行運行
if (php_sapi_name() !== 'cli') {
    exit("請從命令行運行此腳本。\n");
}

// 獲取用戶名和密碼
fwrite(STDOUT, "使用者名稱: ");
$username = trim(fgets(STDIN));

fwrite(STDOUT, "密碼: ");
system('stty -echo'); // 隐藏密碼输入
$password = trim(fgets(STDIN));
system('stty echo');
fwrite(STDOUT, "\n");

// 讀取用戶文件
$userFile = __DIR__ . '/users.txt';
if (!file_exists($userFile)) {
    exit("用戶文件不存在。\n");
}

$found = false;
$lines = file($userFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
    list($user, $hashed) = explode(':', $line, 2);
    if ($user === $username) {
        // 验证密碼
        if (crypt($password, $hashed) === $hashed) {
            echo "身份驗證成功!歡迎,{$username}。\n";
        } else {
            echo "密碼错误。\n";
        }
        $found = true;
        break;
    }
}

if (!$found) {
    echo "用戶不存在。\n";
}

四、如何添加新用戶?

為用戶添加密碼可以通過簡單的命令行工具完成:

 <?php
// 創建新用戶加密條目
$username = readline("新使用者名稱: ");
$password = readline("密碼: ");

// 生成 salt 和 hash
$salt = base64_encode(random_bytes(8));
$salt = str_replace('+', '.', substr($salt, 0, 16)); // 兼容性處理
$fullSalt = '$6$rounds=5000$' . $salt . '$';
$hashedPassword = crypt($password, $fullSalt);

// 輸出結果
echo "{$username}:{$hashedPassword}\n";
// 可追加到 users.txt 文件中

五、結語

這個工具雖然簡單,但在腳本自動化、安全測試或快速原型中非常有用。可以輕鬆集成到Bash 腳本、自動部署流程中,甚至用於保護訪問PHP CLI 工具的接口。

對於生產環境,建議還是採用更專業的用戶認證機制,並對密碼文件進行適當的權限控制。