DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Хеширование MD5 в Oracle9i

Давайте посмотрим, как можно использовать хеширование при администрировании реальных баз данных. Отправляя куда-то конфиденциальную информацию, вы можете вычислить хеш-значение до отправки и выслать его тому же адресату в другом отправлении. Получатель может вычислить хеш-значение для полученных данных и сравнить его с отправленным вами хеш-значением.
В Oracle9i пакет DBMS_OBFUSCATION_TOOLKIT содержит функцию хеширования MD5, реализующую протокол Message Digest. Для хеширования строки делаем следующее:

Я передал функции простую строку «Account Balance is 12345.67» и получил ее хеш-значение. Функция MD5 возвращает значение типа VAR- CHAR2, но (как и при рассмотренном ранее шифровании) это значение содержит управляющие символы. Поэтому необходимо преобразовать его к типу RAW, а затем к шестнадцатеричному формату для удобства хранения. Приведенный выше фрагмент кода возвращает такое значение:

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

Как видите, для одной и той же строки ввода функция каждый раз возвращает идентичные значения: этот факт можно использовать для проверки целостности элемента данных. Обратите внимание, что я говорю о целостности данных, а не базы данных. Целостность базы данных обеспечивается механизмом обеспечения ограничений целостности и транзакций Oracle. Законный пользователь может изменить значение таким образом, что имеющиеся ограничения целостности не будут нарушены, но данные (не база данных) при этом могут быть повреждены. Например, если кто-то специальным оператором SQL изменит баланс счета с 12345,67 долларов на 21345,67 долларов, то этот факт может остаться незамеченным до тех пор, пока не будет проведено расследование.
Если хеш-значение для столбца, хранящего номер социального страхования, вычислить заранее и сохранить, а после извлечения данных из столбца повторно вычислить хеш-значение и сравнить с сохраненным, то несовпадение значений будет свидетельствовать о возможных злонамеренных операциях с данными. Давайте посмотрим, как это работает.


Как видите, хеш-значения отличаются. Результирующее хеш-значение изменится при любом изменении данных, даже если собственно значение не изменится. Хеш-значение изменится при изменении пробела, знака препинания или любого другого элемента.
Теоретически возможно получение одного и того же хеш-значения для двух разных входных значений. Однако, используя такие общераспространенные алгоритмы, как MD5 и SHA-1, вы обеспечиваете чрезвычайно малую вероятность хеш-конфликта - порядка 1 из 1038 (в зависимости от выбранного алгоритма). Если вы не можете допустить наличия даже столь малой вероятности, то вам придется реализовать логику разрешения конфликтов для хеш-функций.
 









jAntivirus