Расшифруйте и зашифруйте, используя методы CallBack в cakephp
Я хочу использовать методы Callbacks, чтобы зашифровать значение, прежде чем оно будет сохранено в моей базе данных, и расшифровать его, прежде чем отобразить обратно в приложении.
Я использовал один из примеров, приведенных в документации.
В моем core.php
Я поставил следующее:
Configure::write('Security.cipherCriptKey','su0HKssPmdbwgK6LdQLqzp0YmyaTI7zO');
В моей модели я использовал два метода:
beforeSave()
public function beforeSave($options = array()) { $value=$this->data['Internship']['encryptedindb']; $encrypted = Security::encrypt($value, Configure::read('Security.cipherCriptKey')); $this->data['Internship']['encryptedindb'] = $encrypted; return true; }
afterFind()
public function afterFind($results, $primary = false) { foreach ($results as $key => $val) { if(isset($val['Internship']['encryptedindb'])){ $results['Internship']['encryptedindb'] = Security::decrypt($val['Internship']['encryptedindb'], Configure::read('Security.cipherCriptKey')); } return $results; } }
beforeSave()
кажется, работает нормально, так как я могу видеть в моей базе данных значение в зашифрованном виде. Однако, на мой взгляд, и когда я хотел бы увидеть расшифровку содержимого поля, оно отображает его как пустое поле. Как будто afterFind()
Метод не может расшифровать его обратно (он всегда возвращает false).
Ниже приведен скриншот моего приложения:
И база данных со значениями в зашифрованном виде:
1 ответ
Функция Security::encrypt($text)
использует алгоритм AES-256 для шифрования $text
, Он возвращает двоичные данные, и поэтому он должен храниться в двоичном типе данных, а не в текстовом типе.
Любое из следующего должно работать:
- BINARY
- VARBINARY
- BLOB (TINYBLOB, BLOB, MEDIUMBLOB и LONGBLOB).
Установка его в VARBINARY(255)
должно быть достаточно.
Для дальнейшего ознакомления смотрите:
- функция
Security::encrypt()
, - Шифрование данных MySQL с использованием методов AES