Возможный дубликат:
PHP 2-стороннее шифрование: мне нужно хранить пароли, которые можно получить
Я планирую хранить информацию о чужой учетной записи для своих пользователей на своем веб-сайте, например, имя пользователя и пароль rapidshare и т. Д. … Я хочу сохранить информацию в безопасности, но я знаю, что если я передам их информацию, я не смогу ее получить для последующего использования ,
Base64 способен расшифровывать, поэтому нет смысла использовать это просто. Моя идея состоит в том, чтобы скрестить пользователя и пройти до и после того, как он получит base64ed таким образом даже после того, как вы расшифруете его, вы получите какой-то забавный текст, если попытаетесь расшифровать. Есть ли функция php, которая принимает значения, которые будут создавать уникальную скремблировку строки и дешифровать ее позже, когда значение будет заново наложено?
Какие-либо предложения?
Вы не должны шифровать пароли, вместо этого вы должны использовать их с помощью алгоритма, такого как bcrypt. В этом ответе объясняется, как правильно реализовать хеширование паролей в PHP . Тем не менее, вот как вы шифруете / расшифровываете:
$key = 'password to (en/de)crypt'; $string = ' string to be encrypted '; // note the spaces
Чтобы зашифровать:
$iv = mcrypt_create_iv( mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_URANDOM ); $encrypted = base64_encode( $iv . mcrypt_encrypt( MCRYPT_RIJNDAEL_128, hash('sha256', $key, true), $string, MCRYPT_MODE_CBC, $iv ) );
Чтобы расшифровать:
$data = base64_decode($encrypted); $iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)); $decrypted = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_128, hash('sha256', $key, true), substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)), MCRYPT_MODE_CBC, $iv ), "\0" );
Предупреждение . В приведенном выше примере шифруется информация, но он не аутентифицирует зашифрованный текст для предотвращения несанкционированного доступа. Вы не должны полагаться на неаутентифицированное шифрование для обеспечения безопасности , тем более, что код, как предусмотрено, уязвим для атак наложения.
Смотрите также:
Кроме того, не просто используйте «пароль» для ключа шифрования. Ключами шифрования являются случайные строки.
Демо на 3v4l.org :
echo 'Encrypted:' . "\n"; var_dump($encrypted); // "m1DSXVlAKJnLm7k3WrVd51omGL/05JJrPluBonO9W+9ohkNuw8rWdJW6NeLNc688=" echo "\n"; echo 'Decrypted:' . "\n"; var_dump($decrypted); // " string to be encrypted "
Предупреждение о безопасности . Этот класс небезопасен. Он использует Rijndael256-ECB , который не является семантически безопасным. Просто потому, что «это работает» не означает «это безопасно». Кроме того, впоследствии он удаляет хвостохранилища из-за неправильного заполнения.
Недавно нашла этот класс, он работает как сон!
class Encryption { var $skey = "yourSecretKey"; // you can change it public function safe_b64encode($string) { $data = base64_encode($string); $data = str_replace(array('+','/','='),array('-','_',''),$data); return $data; } public function safe_b64decode($string) { $data = str_replace(array('-','_'),array('+','/'),$string); $mod4 = strlen($data) % 4; if ($mod4) { $data .= substr('====', $mod4); } return base64_decode($data); } public function encode($value){ if(!$value){return false;} $text = $value; $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->skey, $text, MCRYPT_MODE_ECB, $iv); return trim($this->safe_b64encode($crypttext)); } public function decode($value){ if(!$value){return false;} $crypttext = $this->safe_b64decode($value); $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->skey, $crypttext, MCRYPT_MODE_ECB, $iv); return trim($decrypttext); } }
И назвать это:
$str = "My secret String"; $converter = new Encryption; $encoded = $converter->encode($str ); $decoded = $converter->decode($encoded); echo "$encoded<p>$decoded";
Предупреждение о безопасности: этот код не защищен.
рабочий пример
define('SALT', 'whateveryouwant'); function encrypt($text) { return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); } function decrypt($text) { return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); } $encryptedmessage = encrypt("your message"); echo decrypt($encryptedmessage);
Одна вещь, о которой вам следует знать при работе с шифрованием:
Попытка быть умной и изобретать свою собственную вещь, как правило, оставит вас с чем-то небезопасным.
Вероятно, вам лучше всего воспользоваться одним из расширений криптографии, которые поставляются с PHP.
Это даст вам предельную защиту. Если злоумышленник может запускать произвольный код в своем приложении, он может получить пароли точно так же, как это может сделать ваше приложение. Вы все равно можете получить некоторую защиту от некоторых атак SQL-инъекций и неуместных резервных копий db, если вы храните секретный ключ в файле и используете их для шифрования на пути к db и расшифровки на выходе. Но вы должны использовать bindparams, чтобы полностью избежать проблемы с SQL-инъекцией.
Если вы решили зашифровать, вы должны использовать для этого криптографическую библиотеку высокого уровня, иначе вы ошибетесь. Вам нужно будет проверить правильность настройки клавиатуры, сообщений и проверки целостности, или все ваши усилия по шифрованию малопригодны. GPGME – хороший выбор для одного примера. Mcrypt – слишком низкий уровень, и вы, вероятно, ошибетесь.
Securiy Предупреждение : этот код небезопасен . Помимо уязвимости к атакам с выбранным шифротекстом, его зависимость от
unserialize()
делает его уязвимым для инъекции объектов PHP.
Для обработки строки / массива я использую эти две функции:
function encryptStringArray ($stringArray, $key = "Your secret salt thingie") { $s = strtr(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), serialize($stringArray), MCRYPT_MODE_CBC, md5(md5($key)))), '+/=', '-_,'); return $s; } function decryptStringArray ($stringArray, $key = "Your secret salt thingie") { $s = unserialize(rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode(strtr($stringArray, '-_,', '+/=')), MCRYPT_MODE_CBC, md5(md5($key))), "\0")); return $s; }
Это гибко, так как вы можете хранить / отправлять по URL-адресу строку или массив, потому что строка / массив сериализуется до шифрования.
Проверьте mycrypt (): http://us.php.net/manual/en/book.mcrypt.php
И если вы используете postgres, есть pgcrypto для шифрования уровня базы данных. (упрощает поиск и сортировку)
Лучшая идея для шифрования / дешифрования ваших данных в базе данных, даже если у вас есть доступ к коду, состоит в том, чтобы использовать 2 разных прохода персональный пароль ( user-pass
) для каждого пользователя и частный код для всех пользователей ( system-pass
).
сценарий
user-pass
хранится с md5 в базе данных и используется для проверки каждого пользователя для входа в систему. Этот пользовательский проход отличается для каждого пользователя. system-pass
для шифрования / дешифрования данных. Этот системный пароль для каждого пользователя одинаковый .