Я хочу использовать методы 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).
Ниже приведен скриншот моего приложения:
И база данных со значениями в зашифрованном виде:
Функция Security::encrypt($text)
использует алгоритм AES-256 для шифрования $text
, Он возвращает двоичные данные, и поэтому он должен храниться в двоичном типе данных, а не в текстовом типе.
Любое из следующего должно работать:
Установка его в VARBINARY(255)
должно быть достаточно.
Для дальнейшего ознакомления смотрите:
Других решений пока нет …