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

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

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

开始课程

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



Web应用程序的安全性是开发者的关键任务之一。PHP提供了强大的内置工具用于数据的密码学保护。在本文中,我们将探讨两个主要方向:加密(可逆的数据转换)和哈希(用于完整性验证的单向转换)。



1. PHP中的哈希



哈希用于存储密码、校验和以及验证数据完整性。在PHP中,为此目的使用函数password_hash()和hash()。



1.1. 密码的安全哈希



切勿使用md5或sha1来存储密码。应通过password_hash()使用bcrypt算法:



<?php// 密码哈希$password = 'MySecureP@ss123';$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);

echo $hash; // $2y$12$...

// 密码验证if (password_verify('MySecureP@ss123', $hash)) { echo "密码正确!";} else { echo "密码错误!";}?>


函数password_hash()会自动生成盐值并使用安全的算法。参数cost用于调节计算复杂度(建议值为10-12)。



1.2. 任意数据的哈希



对于文件或数据的完整性验证,请使用SHA-256或SHA-3算法:



<?php$data = "需要验证的重要数据";$hash_sha256 = hash('sha256', $data);$hash_sha3_256 = hash('sha3-256', $data);

echo "SHA-256: " . $hash_sha256 . PHP_EOL;echo "SHA3-256: " . $hash_sha3_256 . PHP_EOL;

// 文件完整性验证$file_hash = hash_file('sha256', '/path/to/file.zip');echo "文件哈希: " . $file_hash;?>


2. PHP中的对称加密



对称加密使用同一个密钥对数据进行加密和解密。PHP支持OpenSSL和Sodium。



2.1. 通过OpenSSL加密(AES-256-GCM)



推荐模式为AES-256-GCM,它提供数据认证:



<?php$data = "秘密消息";$key = random_bytes(32); // 256位密钥$iv = random_bytes(12);  // 96位初始化向量

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

// 解密$decrypted = openssl_decrypt( $encrypted, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);

echo "原始数据: " . $data . PHP_EOL;echo "解密后: " . $decrypted . PHP_EOL;echo "认证标签: " . bin2hex($tag);?>


重要提示:请保存$key和$iv(或它们的组合)以便解密。标签$tag用于验证数据完整性。



2.2. 通过Sodium加密(libsodium)



从PHP 7.2开始,Sodium已成为核心的一部分。它更简单且更安全:



<?php$data = "机密信息";$key = sodium_crypto_secretbox_keygen(); // 生成密钥$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);

// 加密$ciphertext = sodium_crypto_secretbox($data, $nonce, $key);

// 解密$decrypted = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);

echo "已加密: " . base64_encode($ciphertext) . PHP_EOL;echo "已解密: " . $decrypted . PHP_EOL;

// 清除内存sodium_memzero($key);?>


3. 非对称加密(RSA)



非对称加密使用一对密钥(公钥/私钥)。用于安全数据传输:



<?php// 生成密钥$config = [    'private_key_bits' => 2048,    'private_key_type' => OPENSSL_KEYTYPE_RSA,                    

推荐