我正在尝试编写一个web应用程序,允许登录的用户将不同应用程序的密码存储到MySQL数据库中。但为了防止MySQL管理员直接从数据库读取这些密码,我希望在将这些密码发送到数据库之前使其不可读。然后,当用户希望查看其存储的密码时,web应用程序对存储的密码进行解密,并将其显示在屏幕上。
我正在试着找出一种方法来加密那些存储在数据库中的密码,然后在从数据库中读取时解密它们。
因此,例如:-用户希望存储新的密码: Abc123!-网络应用然后将给定的密码转换成‘胡言乱语’[ 234fohj234]j8924] (或类似的东西)并将其存储到db中。-当用户打开web应用程序查看他存储的密码时,他会看到正确的密码: Abc123!-但当MySQL管理员使用像PHPMyAdmin这样的程序来查看/维护数据库时,他只会看到‘胡言乱语’密码,而不是真正的密码。
PHP (或MySQL)是否为这样的事情提供了内置函数?或者,有没有人有任何关于创建函数来完成此任务的提示?
发布于 2013-09-30 23:19:11
PHP提供了MCrypt库来使用双向加密。最大的问题是在哪里存储密钥,但这是另一个问题。你能提供的最好的保护是,当你根本不存储密钥(用于加密),并让用户每次使用你的服务时输入一个密钥。缺点是,这种方式不可能实现忘记密码的功能。
注意不要使用ECB模式进行加密,相同的密码将始终导致相同的密文,而不是使用具有随机IV矢量的另一种模式。由于PHP手册中有使用ECB模式的示例,因此我添加了一个小示例,它使用IV向量并将其存储在结果中。
/**
* Encrypts data with the TWOFISH algorithm. The IV vector will be
* included in the resulting binary string.
* @param string $data Data to encrypt. Trailing \0 characters will get lost.
* @param string $key This key will be used to encrypt the data. The key
* will be hashed to a binary representation before it is used.
* @return string Returns the encrypted data in form of a binary string.
*/
function encryptTwofish($data, $key)
{
if (!defined('MCRYPT_DEV_URANDOM')) throw new Exception('The MCRYPT_DEV_URANDOM source is required (PHP 5.3).');
if (!defined('MCRYPT_TWOFISH')) throw new Exception('The MCRYPT_TWOFISH algorithm is required (PHP 5.3).');
// The cbc mode is preferable over the ecb mode
$td = mcrypt_module_open(MCRYPT_TWOFISH, '', MCRYPT_MODE_CBC, '');
// Twofish accepts a key of 32 bytes. Because usually longer strings
// with only readable characters are passed, we build a binary string.
$binaryKey = hash('sha256', $key, true);
// Create initialization vector of 16 bytes
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_URANDOM);
mcrypt_generic_init($td, $binaryKey, $iv);
$encryptedData = mcrypt_generic($td, $data);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
// Combine iv and encrypted text
return $iv . $encryptedData;
}
/**
* Decrypts data, formerly encrypted with @see encryptTwofish.
* @param string $encryptedData Binary string with encrypted data.
* @param string $key This key will be used to decrypt the data.
* @return string Returns the original decrypted data.
*/
function decryptTwofish($encryptedData, $key)
{
if (!defined('MCRYPT_TWOFISH')) throw new Exception('The MCRYPT_TWOFISH algorithm is required (PHP 5.3).');
$td = mcrypt_module_open(MCRYPT_TWOFISH, '', MCRYPT_MODE_CBC, '');
// Extract initialization vector from encrypted data
$ivSize = mcrypt_enc_get_iv_size($td);
$iv = substr($encryptedData, 0, $ivSize);
$encryptedData = substr($encryptedData, $ivSize);
$binaryKey = hash('sha256', $key, true);
mcrypt_generic_init($td, $binaryKey, $iv);
$decryptedData = mdecrypt_generic($td, $encryptedData);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
// Original data was padded with 0-characters to block-size
return rtrim($decryptedData, "\0");
}https://stackoverflow.com/questions/19093533
复制相似问题