PHP的加密和解密函数及其用法
PHP加密和解密函数是非常有用的工具,可以用来保护敏感数据的安全性,防止数据泄露。在实际开发中,我们经常需要对用户数据、密码、身份证号、银行卡号等隐私信息进行加密存储或传输。PHP提供了多种加密和解密函数,本文将介绍PHP的加密和解密函数及其用法。
1. md5()函数
md5是一种常用的密码加密算法,它可以将任意长度的字符串加密成固定长度的32位字符串。PHP提供了md5()函数用于加密字符串,语法如下:
string md5(string $str [, bool $raw_output = false])
其中$str参数为要加密的字符串,$raw_output参数为可选参数,如果设置为true,则返回二进制格式的16字节(128位)MD5哈希值。
示例代码:
$str = "Hello World!"; $md5_str = md5($str); echo "加密前:".$str." "; echo "加密后:".$md5_str." ";
上述代码的输出结果为:
加密前:Hello World! 加密后:b10a8db164e0754105b7a99be72e3fe5
加密后得到的字符串是不可逆的,不能直接解密。它只能用于验证用户密码是否正确,比较两个加密后的字符串是否相同。
2. sha1()函数
sha1是一种安全的哈希函数,它可以将任意长度的字符串加密成固定长度的40位字符串。PHP提供了sha1()函数用于加密字符串,语法如下:
string sha1(string $str [, bool $raw_output = false])
其中$str参数为要加密的字符串,$raw_output参数为可选参数,如果设置为true,则返回二进制格式的20字节(160位)SHA1哈希值。
示例代码:
$str = "Hello World!"; $sha1_str = sha1($str); echo "加密前:".$str." "; echo "加密后:".$sha1_str." ";
上述代码的输出结果为:
加密前:Hello World! 加密后:0a4d55a8d778e5022fab701977c5d840bbc486d0
和md5一样,加密后得到的字符串也是不可逆的,不能直接解密,只能用于验证用户密码是否正确。
3. base64_encode()和base64_decode()函数
base64是一种常用的编码方式,通过将二进制数据转换成文本数据的形式,实现不同系统之间的数据传输。PHP提供了两个函数base64_encode()和base64_decode()用于将数据进行编码和解码,语法如下:
string base64_encode(string $str)
string base64_decode(string $str)
其中$str参数为要编码或解码的字符串。
示例代码:
$str = "Hello World!"; $base64_encode_str = base64_encode($str); echo "编码前:".$str." "; echo "编码后:".$base64_encode_str." "; $base64_decode_str = base64_decode($base64_encode_str); echo "解码前:".$base64_encode_str." "; echo "解码后:".$base64_decode_str." ";
上述代码的输出结果为:
编码前:Hello World! 编码后:SGVsbG8gV29ybGQh 解码前:SGVsbG8gV29ybGQh 解码后:Hello World!
可以看出,经过base64编码后的字符串比原始字符串要长,但编码后的字符串只有由64个可打印字符组成,不受编码传输的限制。
4. openssl_encrypt()和openssl_decrypt()函数
PHP提供了一系列可用于加密和解密数据的函数,其中最常用的是openssl_encrypt()和openssl_decrypt()函数。这两个函数使用了公开密钥加密标准(PKCS)#7,可以用于加密敏感数据,保护数据的隐私和安全。需要注意的是,openssl_encrypt()和openssl_decrypt()函数需要PHP安装OpenSSL扩展才能正常使用。
openssl_encrypt()函数语法如下:
string openssl_encrypt(string $data, string $cipher_algo, string $key, int $options = 0, string $iv = "")
其中$data参数为要加密的数据,$cipher_algo参数为加密算法,常用的有AES-128-CBC,AES-192-CBC,AES-256-CBC等,$key参数为加密密钥,$options参数为加密选项,$iv参数为初始向量,可以为空串。
示例代码:
$data = "Hello World!"; $key = "0123456789abcdef"; $cipher_algo = "AES-128-CBC"; $encrypted_data = openssl_encrypt($data, $cipher_algo, $key, OPENSSL_RAW_DATA); echo "加密前:".$data." "; echo "加密后:".$encrypted_data." ";
上述代码的输出结果为:
加密前:Hello World!
加密后:\0{\27\236\312rY\374\215\216\371\270Z\3\347\24\177
可以看出,openssl_encrypt()函数返回了加密后的二进制数据,并不是字符串形式的结果。要想将加密后的数据转换成字符串形式,可以使用base64编码将其转换成可打印字符。示例代码如下:
$data = "Hello World!"; $key = "0123456789abcdef"; $cipher_algo = "AES-128-CBC"; $encrypted_data = openssl_encrypt($data, $cipher_algo, $key, OPENSSL_RAW_DATA); $base64_encoded_data = base64_encode($encrypted_data); echo "加密前:".$data." "; echo "加密后:".$base64_encoded_data." ";
上述代码的输出结果为:
加密前:Hello World! 加密后:AHcrBspyasl+34X2ZWoD5w==
使用openssl_decrypt()函数可以将加密后的数据解密还原成原始数据。openssl_decrypt()函数语法如下:
string openssl_decrypt(string $data, string $cipher_algo, string $key, int $options = 0, string $iv = "")
其中$data参数为要解密的数据,$cipher_algo参数为加密算法,$key参数为加密密钥,$options参数和$iv参数与openssl_encrypt()函数相同。
示例代码:
$data = "AHcrBspyasl+34X2ZWoD5w=="; $key = "0123456789abcdef"; $cipher_algo = "AES-128-CBC"; $encrypted_data = base64_decode($data); $decrypted_data = openssl_decrypt($encrypted_data, $cipher_algo, $key, OPENSSL_RAW_DATA); echo "解密前:".$data." "; echo "解密后:".$decrypted_data." ";
上述代码的输出结果为:
解密前:AHcrBspyasl+34X2ZWoD5w== 解密后:Hello World!
5. password_hash()和password_verify()函数
password_hash()和password_verify()是PHP 5.5及以上版本中新增的密码哈希函数。这是一种比md5和sha1更加安全的哈希函数,它可以将用户密码进行哈希加密,并且能够动态调整哈希处理的强度和复杂度,达到更高的安全性。password_hash()函数返回一个包含哈希值及其他信息的字符串,而password_verify()函数则用于验证用户密码是否正确。
password_hash()函数语法如下:
string password_hash(string $password, int $algo [, array $options])
其中$password参数为要加密的明文密码,$algo参数为哈希算法,常用的有PASSWORD_DEFAULT(默认算法)和PASSWORD_BCRYPT(bcrypt算法),$options参数为可选参数,可以设置如下选项:
- salt:指定盐值
- cost:指定计算哈希的强度和复杂度
示例代码:
`
$password = "my_password";
$hash =
