在普通PHP安装中进行双向加密的最简单方法是什么?

我需要能够用字符串密钥加密数据,并使用相同的密钥在另一端解密。

安全性并不像代码的可移植性那么重要,所以我希望能够使事情尽可能简单。目前,我正在使用RC4实现,但如果我能找到本地支持的东西,我想我可以节省很多不必要的代码。


当前回答

使用openssl_encrypt()进行加密 openssl_encrypt函数提供了一种安全而简单的方法来加密数据。

在下面的脚本中,我们使用AES128加密方法,但您可以考虑其他类型的加密方法,这取决于您想加密的内容。

<?php
$message_to_encrypt = "Yoroshikune";
$secret_key = "my-secret-key";
$method = "aes128";
$iv_length = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($iv_length);

$encrypted_message = openssl_encrypt($message_to_encrypt, $method, $secret_key, 0, $iv);

echo $encrypted_message;
?>

下面是对所使用变量的解释:

Message_to_encrypt:要加密的数据 Secret_key:这是你加密的“密码”。一定不要选择太简单的东西,注意不要和其他人分享你的秘密钥匙 Method:加密的方法。这里我们选择AES128。 Iv_length和iv:使用字节准备加密 Encrypted_message:包含加密消息的变量

使用openssl_decrypt()进行解密 现在您已经加密了数据,您可能需要对其进行解密,以便重新使用您首先包含在变量中的消息。为此,我们将使用openssl_decrypt()函数。

<?php
$message_to_encrypt = "Yoroshikune";
$secret_key = "my-secret-key";
$method = "aes128";
$iv_length = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($iv_length);
$encrypted_message = openssl_encrypt($message_to_encrypt, $method, $secret_key, 0, $iv);

$decrypted_message = openssl_decrypt($encrypted_message, $method, $secret_key, 0, $iv);

echo $decrypted_message;
?>

openssl_decrypt()提出的解密方法与openssl_encrypt()很接近。

唯一的区别是,您需要添加已经加密的消息作为openssl_decrypt()的第一个参数,而不是添加$message_to_encrypt。

注意:为了解密,需要保存密钥和iv。

其他回答

PHP 7.2完全摆脱了Mcrypt,现在加密是基于可维护的Libsodium库。

所有的加密需求基本上都可以通过Libsodium库来解决。

// On Alice's computer:
$msg = 'This comes from Alice.';
$signed_msg = sodium_crypto_sign($msg, $secret_sign_key);


// On Bob's computer:
$original_msg = sodium_crypto_sign_open($signed_msg, $alice_sign_publickey);
if ($original_msg === false) {
    throw new Exception('Invalid signature');
} else {
    echo $original_msg; // Displays "This comes from Alice."
}

Libsodium文档:https://github.com/paragonie/pecl-libsodium-doc

使用openssl_encrypt()进行加密 openssl_encrypt函数提供了一种安全而简单的方法来加密数据。

在下面的脚本中,我们使用AES128加密方法,但您可以考虑其他类型的加密方法,这取决于您想加密的内容。

<?php
$message_to_encrypt = "Yoroshikune";
$secret_key = "my-secret-key";
$method = "aes128";
$iv_length = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($iv_length);

$encrypted_message = openssl_encrypt($message_to_encrypt, $method, $secret_key, 0, $iv);

echo $encrypted_message;
?>

下面是对所使用变量的解释:

Message_to_encrypt:要加密的数据 Secret_key:这是你加密的“密码”。一定不要选择太简单的东西,注意不要和其他人分享你的秘密钥匙 Method:加密的方法。这里我们选择AES128。 Iv_length和iv:使用字节准备加密 Encrypted_message:包含加密消息的变量

使用openssl_decrypt()进行解密 现在您已经加密了数据,您可能需要对其进行解密,以便重新使用您首先包含在变量中的消息。为此,我们将使用openssl_decrypt()函数。

<?php
$message_to_encrypt = "Yoroshikune";
$secret_key = "my-secret-key";
$method = "aes128";
$iv_length = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($iv_length);
$encrypted_message = openssl_encrypt($message_to_encrypt, $method, $secret_key, 0, $iv);

$decrypted_message = openssl_decrypt($encrypted_message, $method, $secret_key, 0, $iv);

echo $decrypted_message;
?>

openssl_decrypt()提出的解密方法与openssl_encrypt()很接近。

唯一的区别是,您需要添加已经加密的消息作为openssl_decrypt()的第一个参数,而不是添加$message_to_encrypt。

注意:为了解密,需要保存密钥和iv。

使用带有相应参数的mcrypt_encrypt()和mcrypt_decrypt()。非常简单明了,而且你用的是久经考验的加密包。

编辑

在回答这个问题5年零4个月后,mcrypt扩展现在正处于弃用并最终从PHP中移除的过程中。

这个答案只对PHP 5有效,在PHP 7中使用内置的加密函数。

下面是一个简单但足够安全的实现:

CBC方式AES-256加密 PBKDF2创建加密密钥的明文密码 HMAC来验证加密的消息。

代码和示例在这里:https://stackoverflow.com/a/19445173/1387163

编辑:

你应该使用openssl_encrypt() & openssl_decrypt()

正如Scott所说,Mcrypt并不是一个好主意,因为它自2007年以来就没有更新过。

甚至有一个RFC从PHP中删除Mcrypt - https://wiki.php.net/rfc/mcrypt-viking-funeral