欢迎访问宙启技术站
智能推送

PHP的加密和解密函数及其用法

发布时间:2023-06-07 05:34:25

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 =