2016-03-24 1 views
1

Я хочу расшифровать поля в моей базе данных, используя sql на mysql, но перед расшифровкой мне нужно проверить, можно ли расшифровать эти поля.AES_DECRYPT Как вы проверяете значение уже дешифровано в mysql

update customer 
set name = aes_decrypt(from_base64(name), 'key') 

Если предоставленный ключ неверен или данные недействительны, поле имени будет иметь значение null;

Я попытался добавить предложение where, как показано ниже, чтобы убедиться, что имя поля еще не дешифровано, но это не работает все время, поскольку aes_decrypt может возвращать null или мусор, если ключ неверен или данные недействительны.

update customer 
set name = aes_decrypt(from_base64(name), 'key') 
where aes_decrypt(from_base64(name), 'key') is not null. 

Так как я могу проверить, является ли возвращаемое значение нулевым или «мусором»? Или какой другой подход существует?

Из mysql doc: «возможно, что AES_DECRYPT() возвращает значение, отличное от NULL (возможно, мусор), если входные данные или ключ недействительны».

мусора пример я получаю: ж Y'vYm_

Благодаря

+0

Это несколько тауталогический, но если вы не знаете, как могут выглядеть дешифрованные данные, вы не будете знать, что это действительно так. Если незашифрованные данные были фактическими случайными значениями, то невозможно отличить два разных набора случайных данных. –

+0

Есть что-то (словарь данных приложений), который вы можете проверить, чтобы узнать, зашифрован ли какой-то конкретный стол. Или программа (и программист) должна угадать? ; -/ –

+0

Как вы не можете узнать, зашифровано ли поле и если да, то какой ключ? Это устанавливается при разработке db. Разумеется, вы не микшируете зашифрованные и не зашифрованные в одном поле – zaph

ответ

0

Вместо того чтобы хранить сырой шифротекста, последовать примеру версии 2 от Defuse Security's PHP encryption library:

  1. Use authenticated encryption.
  2. Используйте тег версии, который сообщает, какая библиотека была использована, а также какую версию и любую дополнительную информацию о конфигурации вам нужно добавить.
  3. Обязательно вычислить HMAC (тег || IV || шифртекст) вместо HMAC (зашифрованный текст).
  4. Храните тег, IV/nonce, зашифрованный текст и MAC вместе; предпочтительно в виде строки с шестнадцатеричным или базовым кодом.

Затем возникает вопрос: «Выполняют ли первые N байтов строки известную версию тега моей библиотеки шифрования»?

+0

«было бы безопаснее поставить подпись в конце?» Это буквально не имеет значения, но облегчает говорить SUBSTRING (str, 0, 4) вместо того, чтобы вычислять в зависимости от длины строки. –