MySQL: ВЫБОР по хешу: возможно ли это? - PullRequest
0 голосов
/ 18 декабря 2011

Я не думаю, что это имеет слишком много смысла. Хотя, таким образом, вы можете скрыть реальное статическое значение из файла .php, но сохраняя его хеш-значение в файле php для запроса mysql. Невозможно получить доступ к источнику php-файла с компьютера пользователя, но вы сделали резервные копии ваших файлов, и это статическое значение есть. Я полагаю, что использование хэша столбца решит эту проблему.

Но я не нашел ни примеров, ни документации, говорящих о том, что такие функции можно использовать в запросах (не для значений в SQL-запросах, а для выбора столбцов). Это возможно?

Ответы [ 3 ]

1 голос
/ 18 декабря 2011

Очень медленный запрос, который просто выбирает все строки с пустым «столбцом».

SELECT * FROM table WHERE MD5(column) = 'd41d8cd98f00b204e9800998ecf8427e'

Если вы выполняете много таких запросов, рассмотрите возможность сохранения хеша MD5 в столбце или индексе.Еще лучше было бы выполнить все вычисления MD5 в конце сценария - в тот день, когда вам понадобится дополнительный сервер для вашего проекта, вы заметите, что веб-серверы масштабируются намного лучше, чем серверы баз данных.(Это то, о чем стоит беспокоиться в будущем, конечно)

1 голос
/ 18 декабря 2011

Если я правильно понимаю, вы хотите использовать хеш в качестве первичного ключа:

INSERT INTO MyTable (pk) VALUES (MD5('plain-value'));

Затем вы хотите получить его по хешу, не зная, каков его хэш-дайджест:

SELECT * FROM MyTable WHERE pk = MD5('plain-value');

Каким-то образом это должно обеспечить большую безопасность в случае, если люди украдут резервную копию вашей базы данных и PHP-код?Ну, это не так.Если я знаю исходное простое значение и метод хэширования, я могу найти данные так же легко, как если бы вы не хэшировали значение.

Я согласен с комментарием @scunliffe - мы не уверены, какую именно проблему вы пытаетесь решить, но похоже, что этот метод не решит ее.

Это такженеэффективно использовать хэш-дайджест MD5 в качестве первичного ключа.Вы должны хранить его в CHAR (32) или UNHEX и хранить в BINARY (16).В любом случае, вы не можете использовать INT или даже BIGINT в качестве типа данных первичного ключа.Значения ключей являются более громоздкими и, следовательно, создают большие индексы.

Кроме того, новые строки будут вставляться в произвольном месте в кластеризованном индексе.Это дороже, чем добавление новых значений в конец B-дерева, как вы сделали бы, если бы использовали простые автоинкрементные целые числа, как и все остальные.

1 голос
/ 18 декабря 2011

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

Стандартный способ скрыть секретные значения из исходной базы - хранить эти секретные значения в отдельном файле и никогда не отправлять.этот файл для управления исходным кодом или сделать его резервную копию.Загрузите значение секрета с помощью php-кода, а затем работайте со значением непосредственно в MySQL (один из способов сделать это - сохранить файл «config.php» или что-то в том же духе, что просто устанавливает переменные / константы, а затем простоphp-include файл).

Тем не менее, я все равно отвечу на ваш вопрос.

На самом деле MySQL имеет широкий спектр функций хеширования и шифрования.См. http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html

Поскольку вы отметили свой вопрос md5 Я предполагаю, что функция, которую вы ищете, это MD5: http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html#function_md5

Вы выбираете ее так, как это:

SELECT MD5(column) AS hashed_column FROM table

Тогда значение для сравнения с хешем будет в псевдониме столбца 'hashed_column'.

Или для выбора конкретной строки на основе хеша:

SELECT * FROM table WHERE MD5(column) = 'hashed-value-to-compare'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...