263

我的意思是:

Original String + Salt or Key --> Encrypted String
Encrypted String + Salt or Key --> Decrypted (Original String)

也许是这样的:

"hello world!" + "ABCD1234" --> Encrypt --> "2a2ffa8f13220befbe30819047e23b2c" (may be, for e.g)
"2a2ffa8f13220befbe30819047e23b2c" --> Decrypt with "ABCD1234" --> "hello world!"
  • 在 PHP 中,你怎么能做到这一点?

尝试使用Crypt_Blowfish,但它对我不起作用。

4

10 回答 10

462

在进一步做任何事情之前,请尝试了解加密身份验证之间的区别,以及为什么您可能需要经过身份验证的加密而不仅仅是加密

要实现经过身份验证的加密,您需要先加密,然后再加密 MAC。加密和认证的顺序很重要!这个问题的现有答案之一犯了这个错误;就像许多用 PHP 编写的密码库一样。

您应该避免实现自己的密码学,而应使用由密码学专家编写和审查的安全库。

更新:PHP 7.2 现在提供 libsodium!为了获得最佳安全性,请更新您的系统以使用 PHP 7.2 或更高版本,并且仅遵循此答案中的 libsodium 建议。

如果您有 PECL 访问权限,请使用 libsodium 如果您想要没有 PECL 的 libsodium,请使用 sodium_compat);否则...
使用 defuse/php-encryption;不要滚动你自己的密码学!

上面链接的两个库都可以轻松轻松地将经过身份验证的加密实施到您自己的库中。

如果您仍然想编写和部署自己的密码库,违背互联网上每个密码专家的传统智慧,这些是您必须采取的步骤。

加密:

  1. 在 CTR 模式下使用 AES 加密。您也可以使用 GCM(无需单独的 MAC)。此外,ChaCha20 和 Salsa20(由libsodium提供)是流密码,不需要特殊模式。
  2. 除非您在上面选择 GCM,否则您应该使用 HMAC-SHA-256 验证密文(或者,对于流密码,Poly1305——大多数 libsodium API 都会为您执行此操作)。MAC应该覆盖IV以及密文!

解密:

  1. 除非使用 Poly1305 或 GCM,否则重新计算密文的 MAC 并将其与使用 发送的 MAC 进行比较hash_equals()。如果失败,则中止。
  2. 解密消息。

其他设计考虑:

  1. 永远不要压缩任何东西。密文不可压缩;在加密之前压缩明文会导致信息泄露(例如 TLS 上的 CRIME 和 BREACH)。
  2. 确保使用mb_strlen()and mb_substr(),使用'8bit'字符集模式来防止出现mbstring.func_overload问题。
  3. IV 应该使用CSPRNG生成;如果您正在使用mcrypt_create_iv()请勿使用MCRYPT_RAND
  4. 除非您使用的是 AEAD 结构,否则始终加密然后 MAC!
  5. bin2hex(),base64_encode()等可能会通过缓存时间泄露有关您的加密密钥的信息。如果可能,请避免使用它们。

即使您遵循此处给出的建议,密码学也可能出现很多问题。始终让密码学专家审查您的实施。如果您没有幸与当地大学的密码学专业学生成为私人朋友,您可以随时尝试Cryptography Stack Exchange论坛寻求建议。

如果您需要对您的实施进行专业分析,您可以随时聘请信誉良好的安全顾问团队来审查您的 PHP 加密代码(披露:我的雇主)。

重要:何时不使用加密

不要加密密码。您想使用以下密码散列算法之一对它们进行散列

切勿使用通用哈希函数(MD5、SHA256)来存储密码。

不要加密 URL 参数这是工作的错误工具。

使用 Libsodium 的 PHP 字符串加密示例

如果您使用的是 PHP < 7.2 或者没有安装 libsodium,您可以使用sodium_compat来完成相同的结果(尽管速度较慢)。

<?php
declare(strict_types=1);

/**
 * Encrypt a message
 * 
 * @param string $message - message to encrypt
 * @param string $key - encryption key
 * @return string
 * @throws RangeException
 */
function safeEncrypt(string $message, string $key): string
{
    if (mb_strlen($key, '8bit') !== SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
        throw new RangeException('Key is not the correct size (must be 32 bytes).');
    }
    $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
    
    $cipher = base64_encode(
        $nonce.
        sodium_crypto_secretbox(
            $message,
            $nonce,
            $key
        )
    );
    sodium_memzero($message);
    sodium_memzero($key);
    return $cipher;
}

/**
 * Decrypt a message
 * 
 * @param string $encrypted - message encrypted with safeEncrypt()
 * @param string $key - encryption key
 * @return string
 * @throws Exception
 */
function safeDecrypt(string $encrypted, string $key): string
{   
    $decoded = base64_decode($encrypted);
    $nonce = mb_substr($decoded, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit');
    $ciphertext = mb_substr($decoded, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit');
    
    $plain = sodium_crypto_secretbox_open(
        $ciphertext,
        $nonce,
        $key
    );
    if (!is_string($plain)) {
        throw new Exception('Invalid MAC');
    }
    sodium_memzero($ciphertext);
    sodium_memzero($key);
    return $plain;
}

然后进行测试:

<?php
// This refers to the previous code block.
require "safeCrypto.php"; 

// Do this once then store it somehow:
$key = random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES);
$message = 'We are all living in a yellow submarine';

$ciphertext = safeEncrypt($message, $key);
$plaintext = safeDecrypt($ciphertext, $key);

var_dump($ciphertext);
var_dump($plaintext);

石盐 - Libsodium 变得更容易

我一直在从事的项目之一是一个名为 Halite 的加密库旨在使 libsodium 更简单、更直观。

<?php
use \ParagonIE\Halite\KeyFactory;
use \ParagonIE\Halite\Symmetric\Crypto as SymmetricCrypto;

// Generate a new random symmetric-key encryption key. You're going to want to store this:
$key = new KeyFactory::generateEncryptionKey();
// To save your encryption key:
KeyFactory::save($key, '/path/to/secret.key');
// To load it again:
$loadedkey = KeyFactory::loadEncryptionKey('/path/to/secret.key');

$message = 'We are all living in a yellow submarine';
$ciphertext = SymmetricCrypto::encrypt($message, $key);
$plaintext = SymmetricCrypto::decrypt($ciphertext, $key);

var_dump($ciphertext);
var_dump($plaintext);

所有底层密码学都由 libsodium 处理。

使用 defuse/php-encryption 的示例

<?php
/**
 * This requires https://github.com/defuse/php-encryption
 * php composer.phar require defuse/php-encryption
 */

use Defuse\Crypto\Crypto;
use Defuse\Crypto\Key;

require "vendor/autoload.php";

// Do this once then store it somehow:
$key = Key::createNewRandomKey();

$message = 'We are all living in a yellow submarine';

$ciphertext = Crypto::encrypt($message, $key);
$plaintext = Crypto::decrypt($ciphertext, $key);

var_dump($ciphertext);
var_dump($plaintext);

注意Crypto::encrypt()返回十六进制编码的输出。

加密密钥管理

如果您想使用“密码”,请立即停止。您需要一个随机的 128 位加密密钥,而不是人类容易记住的密码。

您可以存储加密密钥以供长期使用,如下所示:

$storeMe = bin2hex($key);

而且,根据需要,您可以像这样检索它:

$key = hex2bin($storeMe);

强烈建议只存储一个随机生成的密钥以供长期使用,而不是任何类型的密码作为密钥(或派生密钥)。

如果你使用 Defuse 的库:

“但我真的很想用密码。”

这是一个坏主意,但是好的,这里是如何安全地做到这一点。

首先,生成一个随机密钥并将其存储在一个常数中。

/**
 * Replace this with your own salt! 
 * Use bin2hex() then add \x before every 2 hex characters, like so:
 */
define('MY_PBKDF2_SALT', "\x2d\xb7\x68\x1a\x28\x15\xbe\x06\x33\xa0\x7e\x0e\x8f\x79\xd5\xdf");

请注意,您正在添加额外的工作,并且可以使用此常量作为键,并为自己省去很多心痛!

然后使用 PBKDF2(像这样)从您的密码中派生出合适的加密密钥,而不是直接使用您的密码进行加密。

/**
 * Get an AES key from a static password and a secret salt
 * 
 * @param string $password Your weak password here
 * @param int $keysize Number of bytes in encryption key
 */
function getKeyFromPassword($password, $keysize = 16)
{
    return hash_pbkdf2(
        'sha256',
        $password,
        MY_PBKDF2_SALT,
        100000, // Number of iterations
        $keysize,
        true
    );
}

不要只使用 16 个字符的密码。您的加密密钥将被可笑地破坏。

于 2015-05-11T03:12:21.283 回答
113

我参加聚会迟到了,但是在寻找正确的方法时我遇到了这个页面,它是谷歌搜索返回的热门之一,所以我想分享我对这个问题的看法,我认为这是在撰写本文时是最新的(2017 年初)。从 PHP 7.1.0 开始,mcrypt_decryptandmcrypt_encrypt将被弃用,因此构建未来证明代码应使用openssl_encryptopenssl_decrypt

您可以执行以下操作:

$string_to_encrypt="Test";
$password="password";
$encrypted_string=openssl_encrypt($string_to_encrypt,"AES-128-ECB",$password);
$decrypted_string=openssl_decrypt($encrypted_string,"AES-128-ECB",$password);

重要提示:这使用不安全的ECB 模式。如果您想要一个简单的解决方案而不参加密码工程速成课程,请不要自己编写,只需使用库即可。

您也可以使用任何其他削片方法,具体取决于您的安全需要。要了解可用的削片器方法,请参阅openssl_get_cipher_methods函数。

于 2017-01-12T22:24:21.723 回答
45

什么不能做

警告:
此答案使用ECB。ECB 不是一种加密模式,它只是一个构建块。如本答案所示,使用 ECB 实际上并不能安全地加密字符串。不要在您的代码中使用 ECB。请参阅Scott 的答案以获得良好的解决方案。

我自己弄的。其实我在谷歌上找到了一些答案,只是修改了一些东西。然而,结果是完全不安全的。

<?php
define("ENCRYPTION_KEY", "!@#$%^&*");
$string = "This is the original data string!";

echo $encrypted = encrypt($string, ENCRYPTION_KEY);
echo "<br />";
echo $decrypted = decrypt($encrypted, ENCRYPTION_KEY);

/**
 * Returns an encrypted & utf8-encoded
 */
function encrypt($pure_string, $encryption_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv);
    return $encrypted_string;
}

/**
 * Returns decrypted original string
 */
function decrypt($encrypted_string, $encryption_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $encryption_key, $encrypted_string, MCRYPT_MODE_ECB, $iv);
    return $decrypted_string;
}
?>
于 2013-05-17T10:01:48.900 回答
23

对于 Laravel 框架

如果您使用的是 Laravel 框架,那么使用内部函数进行加密和解密会更容易。

$string = 'Some text to be encrypted';
$encrypted = \Illuminate\Support\Facades\Crypt::encrypt($string);
$decrypted_string = \Illuminate\Support\Facades\Crypt::decrypt($encrypted);

var_dump($string);
var_dump($encrypted);
var_dump($decrypted_string);

注意:请务必在 config/app.php 文件的 key 选项中设置 16、24 或 32 个字符的随机字符串。否则,加密值将不安全。

于 2015-12-14T12:58:54.713 回答
18

更新

PHP 7 就绪版本。它使用PHP OpenSSL Library中的openssl_encrypt函数。

class Openssl_EncryptDecrypt {
    function encrypt ($pure_string, $encryption_key) {
        $cipher     = 'AES-256-CBC';
        $options    = OPENSSL_RAW_DATA;
        $hash_algo  = 'sha256';
        $sha2len    = 32;
        $ivlen = openssl_cipher_iv_length($cipher);
        $iv = openssl_random_pseudo_bytes($ivlen);
        $ciphertext_raw = openssl_encrypt($pure_string, $cipher, $encryption_key, $options, $iv);
        $hmac = hash_hmac($hash_algo, $ciphertext_raw, $encryption_key, true);
        return $iv.$hmac.$ciphertext_raw;
    }
    function decrypt ($encrypted_string, $encryption_key) {
        $cipher     = 'AES-256-CBC';
        $options    = OPENSSL_RAW_DATA;
        $hash_algo  = 'sha256';
        $sha2len    = 32;
        $ivlen = openssl_cipher_iv_length($cipher);
        $iv = substr($encrypted_string, 0, $ivlen);
        $hmac = substr($encrypted_string, $ivlen, $sha2len);
        $ciphertext_raw = substr($encrypted_string, $ivlen+$sha2len);
        $original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $encryption_key, $options, $iv);
        $calcmac = hash_hmac($hash_algo, $ciphertext_raw, $encryption_key, true);
        if(function_exists('hash_equals')) {
            if (hash_equals($hmac, $calcmac)) return $original_plaintext;
        } else {
            if ($this->hash_equals_custom($hmac, $calcmac)) return $original_plaintext;
        }
    }
    /**
     * (Optional)
     * hash_equals() function polyfilling.
     * PHP 5.6+ timing attack safe comparison
     */
    function hash_equals_custom($knownString, $userString) {
        if (function_exists('mb_strlen')) {
            $kLen = mb_strlen($knownString, '8bit');
            $uLen = mb_strlen($userString, '8bit');
        } else {
            $kLen = strlen($knownString);
            $uLen = strlen($userString);
        }
        if ($kLen !== $uLen) {
            return false;
        }
        $result = 0;
        for ($i = 0; $i < $kLen; $i++) {
            $result |= (ord($knownString[$i]) ^ ord($userString[$i]));
        }
        return 0 === $result;
    }
}

define('ENCRYPTION_KEY', '__^%&Q@$&*!@#$%^&*^__');
$string = "This is the original string!";

$OpensslEncryption = new Openssl_EncryptDecrypt;
$encrypted = $OpensslEncryption->encrypt($string, ENCRYPTION_KEY);
$decrypted = $OpensslEncryption->decrypt($encrypted, ENCRYPTION_KEY);
于 2019-07-29T08:15:42.860 回答
9

如果你不想使用库(你应该),那么使用这样的东西(PHP 7):

function sign($message, $key) {
    return hash_hmac('sha256', $message, $key) . $message;
}

function verify($bundle, $key) {
    return hash_equals(
      hash_hmac('sha256', mb_substr($bundle, 64, null, '8bit'), $key),
      mb_substr($bundle, 0, 64, '8bit')
    );
}

function getKey($password, $keysize = 16) {
    return hash_pbkdf2('sha256',$password,'some_token',100000,$keysize,true);
}

function encrypt($message, $password) {
    $iv = random_bytes(16);
    $key = getKey($password);
    $result = sign(openssl_encrypt($message,'aes-256-ctr',$key,OPENSSL_RAW_DATA,$iv), $key);
    return bin2hex($iv).bin2hex($result);
}

function decrypt($hash, $password) {
    $iv = hex2bin(substr($hash, 0, 32));
    $data = hex2bin(substr($hash, 32));
    $key = getKey($password);
    if (!verify($data, $key)) {
      return null;
    }
    return openssl_decrypt(mb_substr($data, 64, null, '8bit'),'aes-256-ctr',$key,OPENSSL_RAW_DATA,$iv);
}

$string_to_encrypt='John Smith';
$password='password';
$encrypted_string=encrypt($string_to_encrypt, $password);
$decrypted_string=decrypt($encrypted_string, $password);
于 2018-05-16T14:05:50.647 回答
9

这些是使用AES256 CBC使用 PHP 加密/解密字符串的紧凑方法:

function encryptString($plaintext, $password, $encoding = null) {
    $iv = openssl_random_pseudo_bytes(16);
    $ciphertext = openssl_encrypt($plaintext, "AES-256-CBC", hash('sha256', $password, true), OPENSSL_RAW_DATA, $iv);
    $hmac = hash_hmac('sha256', $ciphertext.$iv, hash('sha256', $password, true), true);
    return $encoding == "hex" ? bin2hex($iv.$hmac.$ciphertext) : ($encoding == "base64" ? base64_encode($iv.$hmac.$ciphertext) : $iv.$hmac.$ciphertext);
}

function decryptString($ciphertext, $password, $encoding = null) {
    $ciphertext = $encoding == "hex" ? hex2bin($ciphertext) : ($encoding == "base64" ? base64_decode($ciphertext) : $ciphertext);
    if (!hash_equals(hash_hmac('sha256', substr($ciphertext, 48).substr($ciphertext, 0, 16), hash('sha256', $password, true), true), substr($ciphertext, 16, 32))) return null;
    return openssl_decrypt(substr($ciphertext, 48), "AES-256-CBC", hash('sha256', $password, true), OPENSSL_RAW_DATA, substr($ciphertext, 0, 16));
}

用法:

$enc = encryptString("mysecretText", "myPassword");
$dec = decryptString($enc, "myPassword");

编辑:这是使用AES256 GCMPBKDF2作为密钥派生的新版本功能,更安全。

function str_encryptaesgcm($plaintext, $password, $encoding = null) {
    if ($plaintext != null && $password != null) {
        $keysalt = openssl_random_pseudo_bytes(16);
        $key = hash_pbkdf2("sha512", $password, $keysalt, 20000, 32, true);
        $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length("aes-256-gcm"));
        $tag = "";
        $encryptedstring = openssl_encrypt($plaintext, "aes-256-gcm", $key, OPENSSL_RAW_DATA, $iv, $tag, "", 16);
        return $encoding == "hex" ? bin2hex($keysalt.$iv.$encryptedstring.$tag) : ($encoding == "base64" ? base64_encode($keysalt.$iv.$encryptedstring.$tag) : $keysalt.$iv.$encryptedstring.$tag);
    }
}

function str_decryptaesgcm($encryptedstring, $password, $encoding = null) {
    if ($encryptedstring != null && $password != null) {
        $encryptedstring = $encoding == "hex" ? hex2bin($encryptedstring) : ($encoding == "base64" ? base64_decode($encryptedstring) : $encryptedstring);
        $keysalt = substr($encryptedstring, 0, 16);
        $key = hash_pbkdf2("sha512", $password, $keysalt, 20000, 32, true);
        $ivlength = openssl_cipher_iv_length("aes-256-gcm");
        $iv = substr($encryptedstring, 16, $ivlength);
        $tag = substr($encryptedstring, -16);
        return openssl_decrypt(substr($encryptedstring, 16 + $ivlength, -16), "aes-256-gcm", $key, OPENSSL_RAW_DATA, $iv, $tag);
    }
}

用法:

$enc = str_encryptaesgcm("mysecretText", "myPassword", "base64"); // return a base64 encrypted string, you can also choose hex or null as encoding.
$dec = str_decryptaesgcm($enc, "myPassword", "base64");
于 2020-06-03T14:23:02.440 回答
8

历史注释:这是在 PHP4 时编写的。这就是我们现在所说的“遗留代码”。

出于历史目的,我已经留下了这个答案 - 但是现在不推荐使用某些方法,不推荐使用 DES 加密方法等。

我没有更新这段代码有两个原因:1)我不再在 PHP 中手动使用加密方法,2)这段代码仍然服务于它的目的:展示加密如何工作的最小、简单的概念在 PHP 中。

如果你发现类似简单的“PHP 加密傻瓜”类型的源代码可以让人们在 10 到 20 行或更少的代码中开始,请在评论中告诉我。

除此之外,请欣赏早期 PHP4 简约加密答案的经典剧集。


理想情况下,您可以 - 或可以获得 - 访问 mcrypt PHP 库的权限,因为它确实很受欢迎并且非常有用的各种任务。以下是不同类型的加密和一些示例代码的简要说明:PHP 中的加密技术

//Listing 3: Encrypting Data Using the mcrypt_ecb Function 

<?php 
echo("<h3> Symmetric Encryption </h3>"); 
$key_value = "KEYVALUE"; 
$plain_text = "PLAINTEXT"; 
$encrypted_text = mcrypt_ecb(MCRYPT_DES, $key_value, $plain_text, MCRYPT_ENCRYPT); 
echo ("<p><b> Text after encryption : </b>"); 
echo ( $encrypted_text ); 
$decrypted_text = mcrypt_ecb(MCRYPT_DES, $key_value, $encrypted_text, MCRYPT_DECRYPT); 
echo ("<p><b> Text after decryption : </b>"); 
echo ( $decrypted_text ); 
?> 

几个警告:

1)当单向哈希可以使用时,切勿使用可逆或“对称”加密。

2)如果数据是真正敏感的,如信用卡或社会安全号码,停止;您需要的不仅仅是任何简单的代码块所能提供的,而是您需要为此目的设计的加密库以及大量时间来研究必要的方法。此外,软件加密可能小于敏感数据安全性的 10%。这就像给核电站重新布线——如果是这样的话,接受这项任务是危险的、困难的并且超出你的知识范围。经济处罚可能是巨大的,因此最好使用服务并将责任交给他们。

3) 此处列出的任何类型的易于实施的加密都可以合理地保护您希望防止被窥探或在意外/故意泄漏的情况下限制暴露的轻度重要信息。但是看看密钥是如何以纯文本形式存储在网络服务器上的,如果他们能得到数据,他们就能得到解密密钥。

尽管如此,玩得开心:)

于 2013-05-17T04:00:36.730 回答
0

下面的代码在 php 中适用于所有具有特殊字符的字符串

   // Encrypt text --

    $token = "9611222007552";

      $cipher_method = 'aes-128-ctr';
      $enc_key = openssl_digest(php_uname(), 'SHA256', TRUE);  
      $enc_iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cipher_method));  
      $crypted_token = openssl_encrypt($token, $cipher_method, $enc_key, 0, $enc_iv) . "::" . bin2hex($enc_iv);
    echo    $crypted_token;
    //unset($token, $cipher_method, $enc_key, $enc_iv);

    // Decrypt text  -- 

    list($crypted_token, $enc_iv) = explode("::", $crypted_token);  
      $cipher_method = 'aes-128-ctr';
      $enc_key = openssl_digest(php_uname(), 'SHA256', TRUE);
      $token = openssl_decrypt($crypted_token, $cipher_method, $enc_key, 0, hex2bin($enc_iv));
    echo   $token;
    //unset($crypted_token, $cipher_method, $enc_key, $enc_iv);
于 2019-07-19T13:54:09.573 回答
0

在 PHP 中,可以使用名为 OpenSSL 的加密扩展函数之一来加密和解密字符串。

openssl_encrypt() 功能: openssl_encrypt() 函数用于加密数据。

语法如下:

字符串 openssl_encrypt(字符串 $data,字符串 $method,字符串 $key,$options = 0,字符串 $iv,字符串 $tag= NULL,字符串 $aad,int $tag_length = 16)

参数如下:

$data:保存需要加密的字符串或数据。

$method:使用openssl_get_cipher_methods()函数采用cipher方法。

$key:它保存加密密钥。

$options:它保存标志 OPENSSL_RAW_DATA 和 OPENSSL_ZERO_PADDING 的按位分离。

$iv:它保存不为 NULL 的初始化向量。

$tag:它保存使用AEAD密码模式(GCM或CCM)时通过引用传递的认证标签。

$aad:它保存额外的身份验证数据。

$tag_length:保存认证标签的长度。对于 GCM 模式,身份验证标签的长度介于 4 到 16 之间。

返回值:成功时返回加密字符串,失败时返回 FALSE。

openssl_decrypt() 函数 openssl_decrypt() 函数用于解密数据。

语法如下:

字符串 openssl_decrypt(字符串 $data,字符串 $method,字符串 $key,int $options = 0,字符串 $iv,字符串 $tag,字符串 $aad)

参数如下:

$data:保存需要加密的字符串或数据。

$method:使用openssl_get_cipher_methods()函数采用cipher方法。

$key:它保存加密密钥。

$options:它保存标志 OPENSSL_RAW_DATA 和 OPENSSL_ZERO_PADDING 的按位分离。

$iv:它保存不为 NULL 的初始化向量。

$tag:它使用 AEAD 密码模式(GCM 或 CCM)保存身份验证标签。当身份验证失败时,openssl_decrypt() 返回 FALSE。

$aad:它保存额外的身份验证数据。

返回值:成功时返回解密后的字符串,失败时返回 FALSE。

方法:首先声明一个字符串并将其存储到变量中,然后使用 openssl_encrypt() 函数对给定字符串进行加密,并使用 openssl_decrypt() 函数对给定字符串进行解密。

您可以在以下位置找到示例: https ://www.geeksforgeeks.org/how-to-encrypt-and-decrypt-a-php-string/

于 2020-09-18T08:30:40.017 回答