2013-06-11 1 views
1

Мне нужно добавить соль в хеш-колонку. Этот хэшированный столбец также используется как индекс в одной из таблиц. Я не хочу использовать ту же твердую кодированную соль для всех значений по очевидным причинам.Создайте ту же соль каждый раз для того же строкового значения

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

Обновление: Спасибо всем за входные данные. Подробнее - Мне нужно зашифровать столбец в базе данных. Этот столбец также используется для поиска строки в таблице, и после шифрования мы не можем использовать ее для поиска, потому что есть вероятность, что мы сможем изменить ключи шифрования в более поздний момент времени. Теперь, чтобы противостоять этому, мы подумали о добавлении столбца Hashed в таблицу, по которой мы можем выполнить поиск (поскольку мы не будем менять алгоритм Hashed, мы всегда можем использовать это для поиска). Чтобы сделать эту хешевую колонку более безопасной, мы подумали о добавлении соли к ней. И так как Солт должен быть случайным, мы не сможем генерировать одну и ту же функцию хэша каждый раз для того же значения, если только мы не используем одну и ту же соль для всех строк. Вот почему я пытался выяснить способ, которым я могу генерировать одну соль для той же строки каждый раз. Но я думаю, что, пройдя все комментарии и предложения от вас, я уверен, что это нехороший дизайн, и я должен пересмотреть свой подход :(

+0

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

ответ

2

Выполнение этого приведет к победе в использовании соль. Чтобы служить по назначению, соль должна быть как можно более случайной.

Подумайте об этом - вы можете использовать хеш строки как «соль», затем хеш исходную строку и что «соль», соль "вместе во второй раз, но полученный хэш все равно будет производным только от исходной строки. Хотя это может обеспечить лишь небольшую защиту от простого радужного стола, этого недостаточно.

+0

Я полностью согласен с вами, но, как существующая система настроена, я не могу придумать другой хороший подход. Мне нужен хэш столбца, который также используется для индексирования. Поэтому я пытался подумать о каком-то подходе, где я могу каким-то образом связать сгенерированную соль с реальной строкой. – Ashu

+0

Можете ли вы создать новую таблицу отношений, которая имеет два столбца: один с идентификатором, а другой с хешем, а затем переделать другие части приложения, чтобы использовать новый идентификатор и определить хэш? В прошлом мне приходилось делать что-то подобное, когда работали с хэшированными SSN. – mikey

+0

Я думаю, что не понимаю. как связать идентификатор и фактическое значение? – Ashu

0

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

+1

, но это не поможет в поиске соленых значений + Хехед. – Ashu

+0

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

4

Использование значения хэша только как индекс или как внешний ключ не должно быть проблемой (просто включите соль в значение хэша), но я понимаю, что вы хотите переделать строку, имея только оригинал (unhashed).

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

Если вы уверены, что вам нужно найти это значение хеша, то ваши единственные варианты - либо не использовать соль (или такую ​​же соль для всех значений), либо зашифровать значение (двустороннее шифрование без IV). Конечно, оба эти варианта более слабый, чем правильное хеширование значения.

Обновление: Согласно вашему обновлению, у вас уже есть зашифрованное значение в базе данных. Это означает, что вы можете искать его, не требуя хэш-значения. Просто закрепите искомое значение, прежде чем выполнять запрос.

+0

@ Крис. Когда я писал «либо не пользуй солью», я не имел в виду ни соли, ни той же соли для каждого значения, потому что постоянная соль технически не соль. И вы правы, что IV сталкивается с теми же проблемами, что и соль. Я на самом деле имел в виду, что если значение должно быть доступно для поиска, всегда есть компромисс в области безопасности. Но если это требование, то это требование. – martinstoeckli

+0

@ Крис - О, это не проблема, это также моя вина, что я не писал это более ясно. Спасибо за ваш комментарий. – martinstoeckli

-1

Соль не должна быть особенно надежной, поэтому вы можете получить соль из струны, используя некристаллический хеш, возможно, FNV hash.Затем вы можете использовать криптографический хэш, например SHA-256, вместе с солью, чтобы сделать безопасное хешированное значение. Преимущество хэша не криптоочистки заключается в том, что он быстрее.

+2

Хотя соль не обязательно должна быть секретной, она не может быть получена из первоначального значения. Это отрицает цель соли, потому что она становится просто более сложной хэш-функцией. Тогда можно было бы построить 1 радужный стол, чтобы получить все исходные значения. – martinstoeckli

+0

Затем используйте защищенный хеш-ключ, например HMAC. Один секретный мастер-ключ можно использовать для HMAC столько строк, сколько вы могли бы разумно захотеть. – rossum

+0

@rossum: Но HMAC не защищает от радужных столов. –