PHP предлагает библиотеку MCrypt использовать двухстороннее шифрование. Самая большая проблема заключается в том, где хранить ключ, но это еще один вопрос. Лучшая защита, которую вы можете дать, - это когда вы вообще не храните ключ (используемый для шифрования) и позволяете пользователю вводить ключ каждый раз, когда он использует вашу службу. Недостатком является то, что функция забытого пароля недоступна таким образом.
Будьте осторожны, чтобы не использовать режим ECB для шифрования, тот же пароль всегда будет приводить к тому же самому cyphertext, вместо этого использует другой режим со случайным 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");
}
Это называется шифрованием, и хорошо документировано в [PHP документах] (http://www.php.net/manual/en/intro.mcrypt.php) –
http://perishablepress.com/ encoding-decoding-php/goog статья о кодировании и декодировании – Rab
@Rab - не совсем ссылка, которую я бы рекомендовал, поскольку единственное упомянутое шифрование - rot13 –