PHP中的密码学:加密与哈希(实用指南)

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP中的密码学:数据加密与哈希



在现代Web开发中,数据安全不是可选项,而是强制性要求。PHP提供了强大的密码学保护工具库,主要分为两个方向:加密(可逆的数据转换)和哈希(不可逆的转换)。在本文中,我们将通过实际示例介绍PHP用于这两类任务的核心库和函数。



1. PHP密码学基本概念



在进入代码之前,区分两种操作类型很重要:

  • 加密 — 在拥有密钥的情况下可以恢复原始数据的数据转换。用于传输机密信息。
  • 哈希 — 无法恢复原始数据的单向转换。用于存储密码和验证完整性。


PHP使用openssl扩展(用于加密)和password_hash/hash(用于哈希)。



2. PHP中的数据加密



2.1. 对称加密(AES)



最流行的算法是AES-256-GCM,它提供高性能和内置认证。



<?php// 加密$data = "秘密消息";$key = openssl_random_pseudo_bytes(32); // 256位密钥$iv = openssl_random_pseudo_bytes(12);  // GCM的96位向量

$encrypted = openssl_encrypt( $data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);

// 编码为base64以便传输$encrypted_base64 = base64_encode($iv . $tag . $encrypted);

// 解密$decoded = base64_decode($encrypted_base64);$iv = substr($decoded, 0, 12);$tag = substr($decoded, 12, 16);$ciphertext = substr($decoded, 28);

$decrypted = openssl_decrypt( $ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);

echo "解密结果: " . $decrypted; // 秘密消息?>


重要提示:永远不要使用ECB模式——它不安全。始终使用GCM或带HMAC的CBC模式。



2.2. 非对称加密(RSA)



RSA用于密钥交换和数字签名。PHP使用密钥对(公钥/私钥)。



<?php// 生成密钥$config = [    "private_key_bits" => 2048,    "private_key_type" => OPENSSL_KEYTYPE_RSA,];$res = openssl_pkey_new($config);openssl_pkey_export($res, $privateKey);$publicKey = openssl_pkey_get_details($res)['key'];

// 使用公钥加密$data = "机密数据";openssl_public_encrypt($data, $encrypted, $publicKey);

// 使用私钥解密openssl_private_decrypt($encrypted, $decrypted, $privateKey);

echo $decrypted; // 机密数据?>


3. 密码哈希



密码哈希是一项至关重要的任务。PHP提供了专用函数,可以自动选择盐值和计算成本。



3.1. bcrypt(默认推荐)



password_hash()函数配合PASSWORD_BCRYPT算法可以创建带有自动盐值的安全哈希。



<?php$password = "UserPassword123!";

// 哈希$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);echo "哈希值: " . $hash . ""; // $2y$12$...

// 验证if (password_verify($password, $hash)) { echo "密码正确!";} else { echo "密码错误";}

// 检查是否需要重新哈希if (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 12])) { $newHash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);}?>


3.2. Argon2(现代标准)



从PHP 7.2开始

推荐