本文目录导读:

我来帮你创建一个PHP密码保险箱系统,这是一个安全的密码管理器,用于存储和管理各种账号密码。
完整的PHP密码保险箱代码
数据库结构 (SQL)
-- 创建数据库
CREATE DATABASE password_vault;
USE password_vault;
-- 用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
master_key VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 密码条目表
CREATE TABLE passwords (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
site_name VARCHAR(100) NOT NULL,
site_url VARCHAR(255),
username_encrypted TEXT NOT NULL,
password_encrypted TEXT NOT NULL,
notes TEXT,
category VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
主配置文件 (config.php)
<?php
// 数据库配置
define('DB_HOST', 'localhost');
define('DB_NAME', 'password_vault');
define('DB_USER', 'root');
define('DB_PASS', '');
// 加密配置
define('ENCRYPTION_METHOD', 'aes-256-cbc');
define('HASH_ALGORITHM', 'sha256');
// 会话配置
session_start();
// 数据库连接
function getDB() {
try {
$pdo = new PDO(
"mysql:host=" . DB_HOST . ";dbname=" . DB_NAME,
DB_USER,
DB_PASS,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
return $pdo;
} catch (PDOException $e) {
die("数据库连接失败: " . $e->getMessage());
}
}
加密类 (Encryption.php)
<?php
class Encryption {
// 加密密码
public static function encrypt($data, $key) {
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length(ENCRYPTION_METHOD));
$encrypted = openssl_encrypt($data, ENCRYPTION_METHOD, $key, 0, $iv);
return base64_encode($encrypted . '::' . $iv);
}
// 解密密码
public static function decrypt($data, $key) {
list($encrypted_data, $iv) = explode('::', base64_decode($data), 2);
return openssl_decrypt($encrypted_data, ENCRYPTION_METHOD, $key, 0, $iv);
}
// 生成安全随机密钥
public static function generateKey($length = 32) {
return bin2hex(openssl_random_pseudo_bytes($length));
}
// 生成主密码哈希
public static function hashMasterPassword($password) {
return password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
}
// 验证主密码
public static function verifyMasterPassword($password, $hash) {
return password_verify($password, $hash);
}
}
用户认证 (auth.php)
<?php
require_once 'config.php';
require_once 'Encryption.php';
class Auth {
// 用户注册
public static function register($username, $password) {
$db = getDB();
// 检查用户名是否已存在
$stmt = $db->prepare("SELECT id FROM users WHERE username = ?");
$stmt->execute([$username]);
if ($stmt->fetch()) {
return ['success' => false, 'message' => '用户名已存在'];
}
// 生成主密钥和哈希
$masterKey = Encryption::generateKey();
$passwordHash = Encryption::hashMasterPassword($password);
// 插入用户
$stmt = $db->prepare("INSERT INTO users (username, password_hash, master_key) VALUES (?, ?, ?)");
$stmt->execute([$username, $passwordHash, $masterKey]);
return ['success' => true, 'message' => '注册成功'];
}
// 用户登录
public static function login($username, $password) {
$db = getDB();
$stmt = $db->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$user || !Encryption::verifyMasterPassword($password, $user['password_hash'])) {
return ['success' => false, 'message' => '用户名或密码错误'];
}
// 设置会话
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
$_SESSION['master_key'] = $user['master_key'];
return ['success' => true, 'message' => '登录成功'];
}
// 注销
public static function logout() {
session_destroy();
return ['success' => true, 'message' => '已注销'];
}
// 检查登录状态
public static function isLoggedIn() {
return isset($_SESSION['user_id']);
}
}
密码管理器 (PasswordManager.php)
<?php
require_once 'config.php';
require_once 'Encryption.php';
class PasswordManager {
// 添加密码
public static function addPassword($siteName, $siteUrl, $username, $password, $notes = '', $category = '其他') {
if (!isset($_SESSION['user_id']) || !isset($_SESSION['master_key'])) {
return ['success' => false, 'message' => '未登录'];
}
$db = getDB();
$user_id = $_SESSION['user_id'];
$masterKey = $_SESSION['master_key'];
// 加密用户名和密码
$encryptedUsername = Encryption::encrypt($username, $masterKey);
$encryptedPassword = Encryption::encrypt($password, $masterKey);
$stmt = $db->prepare("INSERT INTO passwords (user_id, site_name, site_url, username_encrypted, password_encrypted, notes, category) VALUES (?, ?, ?, ?, ?, ?, ?)");
$stmt->execute([$user_id, $siteName, $siteUrl, $encryptedUsername, $encryptedPassword, $notes, $category]);
return ['success' => true, 'message' => '密码添加成功', 'id' => $db->lastInsertId()];
}
// 获取所有密码
public static function getAllPasswords($category = null) {
if (!isset($_SESSION['user_id'])) {
return [];
}
$db = getDB();
$user_id = $_SESSION['user_id'];
$masterKey = $_SESSION['master_key'];
$sql = "SELECT * FROM passwords WHERE user_id = ?";
$params = [$user_id];
if ($category) {
$sql .= " AND category = ?";
$params[] = $category;
}
$sql .= " ORDER BY site_name ASC";
$stmt = $db->prepare($sql);
$stmt->execute($params);
$passwords = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 解密数据
foreach ($passwords as &$item) {
$item['username'] = Encryption::decrypt($item['username_encrypted'], $masterKey);
$item['password'] = Encryption::decrypt($item['password_encrypted'], $masterKey);
unset($item['username_encrypted']);
unset($item['password_encrypted']);
}
return $passwords;
}
// 搜索密码
public static function searchPasswords($keyword) {
if (!isset($_SESSION['user_id'])) {
return [];
}
$db = getDB();
$user_id = $_SESSION['user_id'];
$stmt = $db->prepare("SELECT * FROM passwords WHERE user_id = ? AND (site_name LIKE ? OR site_url LIKE ?)");
$stmt->execute([$user_id, "%$keyword%", "%$keyword%"]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// 更新密码
public static function updatePassword($id, $siteName, $siteUrl, $username, $password, $notes, $category) {
if (!isset($_SESSION['user_id']) || !isset($_SESSION['master_key'])) {
return ['success' => false, 'message' => '未登录'];
}
$db = getDB();
$masterKey = $_SESSION['master_key'];
$encryptedUsername = Encryption::encrypt($username, $masterKey);
$encryptedPassword = Encryption::encrypt($password, $masterKey);
$stmt = $db->prepare("UPDATE passwords SET site_name = ?, site_url = ?, username_encrypted = ?, password_encrypted = ?, notes = ?, category = ? WHERE id = ? AND user_id = ?");
$stmt->execute([$siteName, $siteUrl, $encryptedUsername, $encryptedPassword, $notes, $category, $id, $_SESSION['user_id']]);
return ['success' => true, 'message' => '密码更新成功'];
}
// 删除密码
public static function deletePassword($id) {
if (!isset($_SESSION['user_id'])) {
return ['success' => false, 'message' => '未登录'];
}
$db = getDB();
$stmt = $db->prepare("DELETE FROM passwords WHERE id = ? AND user_id = ?");
$stmt->execute([$id, $_SESSION['user_id']]);
return ['success' => true, 'message' => '密码删除成功'];
}
// 生成强密码
public static function generateStrongPassword($length = 16) {
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+-=[]{}|;:,.<>?';
$password = '';
$charLength = strlen($chars) - 1;
for ($i = 0; $i < $length; $i++) {
$password .= $chars[mt_rand(0, $charLength)];
}
return $password;
}
// 获取分类列表
public static function getCategories() {
return ['社交', '工作', '金融', '购物', '娱乐', '教育', '其他'];
}
}
登录页面 (login.php)
<?php
require_once 'auth.php';
$message = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['action']) && $_POST['action'] === 'login') {
$result = Auth::login($_POST['username'], $_POST['password']);
if ($result['success']) {
header('Location: dashboard.php');
exit;
}
$message = $result['message'];
} elseif (isset($_POST['action']) && $_POST['action'] === 'register') {
$result = Auth::register($_POST['username'], $_POST['password']);
$message = $result['message'];
}
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">密码保险箱 - 登录</title>
<style>
body {
font-family: Arial, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
margin: 0;
}
.container {
background: white;
padding: 30px;
border-radius: 10px;
box-shadow: 0 0 20px rgba(0,0,0,0.1);
width: 350px;
}
h2 {
text-align: center;
color: #333;
margin-bottom: 30px;
}
.form-group {
margin-bottom: 20px;
}
label {
display: block;
margin-bottom: 5px;
color: #666;
}
input {
width: 100%;
padding: 10px;
border: 1px solid #ddd;
border-radius: 5px;
box-sizing: border-box;
}
button {
width: 100%;
padding: 12px;
background: #667eea;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
}
button:hover {
background: #5a67d8;
}
.message {
padding: 10px;
background: #ff6b6b;
color: white;
border-radius: 5px;
margin-bottom: 20px;
display: <?php echo $message ? 'block' : 'none'; ?>;
}
.toggle-form {
text-align: center;
margin-top: 15px;
color: #667eea;
cursor: pointer;
}
.hidden {
display: none;
}
</style>
</head>
<body>
<div class="container">
<h2>🔒 密码保险箱</h2>
<div class="message"><?php echo $message; ?></div>
<!-- 登录表单 -->
<form id="loginForm" method="POST">
<input type="hidden" name="action" value="login">
<div class="form-group">
<label>用户名</label>
<input type="text" name="username" required>
</div>
<div class="form-group">
<label>密码</label>
<input type="password" name="password" required>
</div>
<button type="submit">登录</button>
</form>
<!-- 注册表单 -->
<form id="registerForm" class="hidden" method="POST">
<input type="hidden" name="action" value="register">
<div class="form-group">
<label>用户名</label>
<input type="text" name="username" required>
</div>
<div class="form-group">
<label>密码</label>
<input type="password" name="password" required>
</div>
<div class="form-group">
<label>确认密码</label>
<input type="password" name="confirm_password" required>
</div>
<button type="submit">注册</button>
</form>
<div class="toggle-form" onclick="toggleForms()">
没有账号?点击注册
</div>
</div>
<script>
function toggleForms() {
document.getElementById('loginForm').classList.toggle('hidden');
document.getElementById('registerForm').classList.toggle('hidden');
document.querySelector('.toggle-form').textContent =
document.getElementById('loginForm').classList.contains('hidden') ?
'已有账号?点击登录' : '没有账号?点击注册';
}
</script>
</body>
</html>
主控制面板 (dashboard.php)
<?php
require_once 'auth.php';
require_once 'PasswordManager.php';
// 检查登录状态
if (!Auth::isLoggedIn()) {
header('Location: login.php');
exit;
}
$message = '';
$passwords = [];
// 处理操作
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$action = $_POST['action'] ?? '';
switch ($action) {
case 'add':
$result = PasswordManager::addPassword(
$_POST['site_name'],
$_POST['site_url'],
$_POST['username'],
$_POST['password'],
$_POST['notes'] ?? '',
$_POST['category'] ?? '其他'
);
$message = $result['message'];
break;
case 'delete':
$result = PasswordManager::deletePassword($_POST['id']);
$message = $result['message'];
break;
case 'generate':
$generatedPassword = PasswordManager::generateStrongPassword();
$message = "生成的密码: " . $generatedPassword;
break;
}
}
// 获取所有密码
$passwords = PasswordManager::getAllPasswords($_GET['category'] ?? null);
$categories = PasswordManager::getCategories();
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">密码保险箱</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
background: #f4f4f4;
}
.header {
background: #667eea;
color: white;
padding: 15px 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.user-info {
display: flex;
align-items: center;
gap: 15px;
}
.logout-btn {
background: #ff6b6b;
color: white;
border: none;
padding: 8px 15px;
border-radius: 5px;
cursor: pointer;
}
.container {
max-width: 1200px;
margin: 20px auto;
padding: 0 20px;
}
.message {
background: #ff6b6b;
color: white;
padding: 10px 15px;
border-radius: 5px;
margin-bottom: 20px;
display: <?php echo $message ? 'block' : 'none'; ?>;
}
.add-form {
background: white;
padding: 20px;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
margin-bottom: 30px;
}
.form-row {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 15px;
margin-bottom: 15px;
}
.form-group {
margin-bottom: 15px;
}
.form-group label {
display: block;
margin-bottom: 5px;
color: #666;
font-size: 14px;
}
.form-group input,
.form-group select,
.form-group textarea {
width: 100%;
padding: 8px 12px;
border: 1px solid #ddd;
border-radius: 5px;
}
.btn {
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 14px;
}
.btn-primary {
background: #667eea;
color: white;
}
.btn-success {
background: #48bb78;
color: white;
}
.btn-danger {
background: #ff6b6b;
color: white;
}
.btn-sm {
padding: 5px 10px;
font-size: 12px;
}
.password-list {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 20px;
}
.password-card {
background: white;
padding: 20px;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.password-card h3 {
color: #333;
margin-bottom: 10px;
}
.password-card .site-url {
color: #667eea;
font-size: 14px;
margin-bottom: 10px;
}
.password-card .details {
margin-bottom: 15px;
}
.password-card .details p {
margin-bottom: 5px;
color: #666;
}
.password-card .actions {
display: flex;
gap: 10px;
}
.category-tag {
display: inline-block;
padding: 3px 8px;
background: #e2e8f0;
border-radius: 3px;
font-size: 12px;
color: #666;
}
.search-bar {
display: flex;
gap: 10px;
margin-bottom: 20px;
}
.search-bar input {
flex: 1;
padding: 10px;
border: 1px solid #ddd;
border-radius: 5px;
}
</style>
</head>
<body>
<div class="header">
<h1>🔒 密码保险箱</h1>
<div class="user-info">
<span>欢迎, <?php echo $_SESSION['username']; ?></span>
<form method="POST" style="display: inline;">
<input type="hidden" name="action" value="logout">
<button type="submit" class="logout-btn">注销</button>
</form>
</div>
</div>
<div class="container">
<?php if ($message): ?>
<div class="message"><?php echo $message; ?></div>
<?php endif; ?>
<!-- 添加密码表单 -->
<div class="add-form">
<h2 style="margin-bottom: 20px;">添加新密码</h2>
<form method="POST">
<input type="hidden" name="action" value="add">
<div class="form-row">
<div class="form-group">
<label>网站名称 *</label>
<input type="text" name="site_name" required>
</div>
<div class="form-group">
<label>网站URL</label>
<input type="url" name="site_url" placeholder="https://example.com">
</div>
<div class="form-group">
<label>分类</label>
<select name="category">
<?php foreach ($categories as $cat): ?>
<option value="<?php echo $cat; ?>"><?php echo $cat; ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="form-row">
<div class="form-group">
<label>用户名 *</label>
<input type="text" name="username" required>
</div>
<div class="form-group">
<label>密码 *</label>
<input type="text" name="password" id="newPassword" required>
</div>
<div class="form-group" style="display: flex; align-items: flex-end;">
<button type="button" class="btn btn-success" onclick="generatePassword()">生成密码</button>
</div>
</div>
<div class="form-group">
<label>备注</label>
<textarea name="notes" rows="3"></textarea>
</div>
<button type="submit" class="btn btn-primary">保存密码</button>
</form>
</div>
<!-- 密码列表 -->
<h2 style="margin-bottom: 20px;">我的密码</h2>
<div class="password-list">
<?php foreach ($passwords as $item): ?>
<div class="password-card">
<h3><?php echo htmlspecialchars($item['site_name']); ?></h3>
<div class="site-url"><?php echo htmlspecialchars($item['site_url']); ?></div>
<span class="category-tag"><?php echo htmlspecialchars($item['category']); ?></span>
<div class="details">
<p><strong>用户名:</strong> <?php echo htmlspecialchars($item['username']); ?></p>
<p><strong>密码:</strong>
<span id="password-<?php echo $item['id']; ?>" style="display: inline;">
••••••••
</span>
<button class="btn btn-sm btn-primary" onclick="togglePassword(<?php echo $item['id']; ?>, '<?php echo htmlspecialchars($item['password']); ?>')">
显示
</button>
<button class="btn btn-sm btn-success" onclick="copyToClipboard('<?php echo htmlspecialchars($item['password']); ?>')">
复制
</button>
</p>
<?php if ($item['notes']): ?>
<p><strong>备注:</strong> <?php echo htmlspecialchars($item['notes']); ?></p>
<?php endif; ?>
</div>
<div class="actions">
<form method="POST" onsubmit="return confirm('确定删除此密码?')">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="id" value="<?php echo $item['id']; ?>">
<button type="submit" class="btn btn-danger btn-sm">删除</button>
</form>
</div>
</div>
<?php endforeach; ?>
<?php if (empty($passwords)): ?>
<p style="text-align: center; color: #999; padding: 20px;">还没有保存任何密码</p>
<?php endif; ?>
</div>
</div>
<script>
function generatePassword() {
const length = 16;
const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+-=[]{}|;:,.<>?';
let password = '';
for (let i = 0; i < length; i++) {
password += chars[Math.floor(Math.random() * chars.length)];
}
document.getElementById('newPassword').value = password;
}
function togglePassword(id, password) {
const element = document.getElementById('password-' + id);
if (element.style.display === 'none' || element.textContent === '••••••••') {
element.textContent = password;
element.style.display = 'inline';
} else {
element.textContent = '••••••••';
}
}
function copyToClipboard(text) {
navigator.clipboard.writeText(text).then(() => {
alert('密码已复制到剪贴板');
}).catch(() => {
alert('复制失败');
});
}
</script>
</body>
</html>
安全特性
- AES-256-CBC加密:所有密码在数据库中都经过加密
- bcrypt密码哈希:主密码使用bcrypt算法存储
- 主密钥系统:每个用户拥有唯一的主密钥
- 会话管理:使用PHP会话管理登录状态
- SQL注入防护:使用预处理语句
使用步骤
- 创建数据库:运行SQL脚本创建表结构
- 修改配置:在
config.php中修改数据库连接信息 - 部署代码:将所有文件放在Web服务器目录
- 访问应用:通过浏览器访问
login.php - 注册账号:创建主账号和主密码
- 开始使用:登录后添加和管理密码
这个密码保险箱系统安全可靠,适合个人或团队使用,你可以根据需求进一步扩展功能,如添加密码导出、两步验证等。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播