Encrypt/Decrypt 使用 php7 加盐的字符串

Encrypt/Decrypt string with salt using php7

我有一个字符串,我想将这个字符串安全地存储在数据库中。

所以,我想到的是使用用户密码作为加密密钥来加密这个字符串。

当用户需要使用这个字符串时,我们使用那个密钥解密它。

是否有某种算法可以帮助将这些字符串安全地存储在数据库中,防止任何人甚至团队访问它?

您想使用某种类型的共享秘密加密算法,例如 AES。 openssl 和 mcrypt 都应该支持这个。我会推荐 openssl,因为 mcrypt 已停产。

下面的例子直接来自php.net。您可能不需要 hmac,因为您想要检索原始数据。

<?php
//$key previously generated safely, ie: openssl_random_pseudo_bytes
$plaintext = "message to be encrypted";
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
//$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
$ciphertext = base64_encode( $iv./*$hmac.*/$ciphertext_raw );

//decrypt later....
$c = base64_decode($ciphertext);
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = substr($c, 0, $ivlen);
//$hmac = substr($c, $ivlen, $sha2len=32);
$ciphertext_raw = substr($c, $ivlen/*+$sha2len*/);
$original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
/*
$calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
if (hash_equals($hmac, $calcmac))//PHP 5.6+ timing attack safe comparison
{
    echo $original_plaintext."\n";
}
*/