2016-04-15 5 views
4

Я шифрую с использованием PHP перед сохранением зашифрованных данных в MySQL. Я убежден, что это лучший способ в долгосрочной перспективе и использовать функции AES_ * MySQL.Лучший способ поиска зашифрованных данных внутри MySQL

Вопрос теперь в том, есть ли эффективный способ поиска зашифрованных данных, кроме сохранения сохраненной хешированной версии данных? Например, два столбца на данные: first_name_encrypted, first_name_hashed.

$hashed_search = myhash('John');  
$q = "SELECT * FROM table WHERE first_name_hashed = '$hashed_search'"; 

Это то, что я сейчас делаю, есть ли лучший способ?

+0

Как вы собираетесь искать зашифрованные данные? Каким будет поисковый запрос? – Quassnoi

+2

Что здесь используется для шифрования? После хэширования данных вы можете делать только точные совпадения, нет возможности выполнять частичное совпадение. – tadman

+0

То, что вы ищете, является строкой, и вам нужно процитировать ее соответствующим образом. Теоретически это должно вызывать синтаксическую ошибку. –

ответ

0

Как правило, вы не должны шифровать данные, хранящиеся в базе данных, которые необходимо искать.

В вашем примере вы даете, это было бы полезно знать контекст, почему вы захватывая пользователя по имени, и что ваши общие проблемы безопасности ...

$hashed_search = myhash('John');  
$q = 'SELECT * FROM table WHERE first_name_hashed = '.$hashed_search; 

Является ли это веб приложение, и ваша главная проблема заключается в незашифрованной передаче личной информации пользователя по сети? Используйте шифрованное соединение при отправке данных между ПК пользователя и сервером (например, «https»).

Вы беспокоитесь, что кто-то взломал сервер и загрузил копию базы данных? Подумайте об ограничении количества личной информации, которую вы храните. Вам действительно нужно хранить настоящее имя пользователя?

Предполагая, что вам необходимо хранить личную идентификационную информацию о пользователе, подумайте о том, чтобы использовать другие методы для извлечения своих записей из базы данных, чем с помощью лично идентифицирующих частей (т. Е. Не захватывать их по «first_name»). Рассмотрите возможность захвата пользователя по идентификатору или именем пользователя, которое может быть не связано с их настоящими именами. Это позволит вам использовать индексирование для быстрого извлечения записей, и вы можете зашифровать свою личную информацию (имя, фамилию, адрес электронной почты, номер телефона и т. Д.) До вашего сердца.

Если это вас не устраивает, возможно, вы найдете более подробные сведения о том, что вы пытаетесь выполнить и почему.

TLDR: Попытка поиска по зашифрованным данным - плохая идея. Подумайте, какую проблему вы пытаетесь избежать, и придумайте альтернативное решение.

+0

Вы можете индексировать зашифрованный столбец, зашифровать значение поиска и затем искать без дополнительных накладных расходов. * Однако *, для всех практических целей это полезно только для точных совпадений. Поиск имен, например, больше или меньше заданного значения, не будет работать, поскольку он находится в зашифрованном порядке, а не в порядке базовых данных. – Mike

1

Вопрос теперь в том, есть ли эффективный способ поиска зашифрованных данных, кроме сохранения сохраненной хешированной версии данных? Например, два столбца на данные: first_name_encrypted, first_name_hashed.

Закрыть, но нет сигары. См.: How to search encrypted information with a blind index.

Одним из примеров, используя authenticated encryption library вместо того, чтобы просто с помощью встроенных функций AES_*() в MySQL:

$first_name_hash = hash_hmac('sha256', $firstName, $secretKey); 
$stmt = $db->prepare('SELECT * FROM table WHERE first_name_idx = ?'); 
$result = $db->execute([$first_name_hash]) 
    ->fetch(PDO::FETCH_ASSOC); 
if ($result) { 
    $first_name = Crypto::decrypt($result['first_name_encrypted'], $otherSecretKey); 
} 

Слепой индекс, основанный на HMAC-SHA256 предпочтительнее простой хэш.

Также: Используйте аутентифицированное шифрование. Это не подлежит обсуждению.

Смежные вопросы