Шифрование паролей в СУБД Oracle

       

Алгоритм


Как описано в документации, в СУБД Oracle для создания паролей может использоваться следующий набор символов:

  1. цифры '0123456789',
  2. буквы 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  3. символы !"#$%&()`*+,-/:;<=>?_.

Поскольку все символы преобразуются к верхнему регистру, то мощность алфавита паролей равна 10+26+21=57 символов. В результате допустимых паролей может быть

(все пароли длиной 1 символ, плюс все пароли длиной два символа и т.д. до 30 символов). Однако, во многих случая этот набор немного меньше, потому что некоторые символы из п.3 неудобно использовать, например, в скриптах shell.

Эксперименты показали, что в качестве пароля могут выступать вообще любые символы:

SQL> create user yu identified by "Пудовченко"; User created.

SQL> create user yu2 identified by "

"; User created.

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

В базе данных пароли пользователей хранятся в виде 8-байтовых хешей в таблице SYS.USER$.

В [] этот алгоритм описан так:

  1. Конкатенировать логин и пароль пользователя (обозначим эту операцию ).
  2. Преобразовать полученную строку к верхнему регистру (UPPER(ЛогинПароль)).
  3. Если в ОС используется однобайтовая кодировка, то преобразовать каждый символ в двухбайтовый, заполнив старший байт нулями (0x00).
  4. Зашифровать получившуюся строку (дополняя ее нулями до длины блока), используя алгоритм DES в режиме CBC с фиксированным ключом, значение которого есть 0x0123456789ABCDEF.
  5. Зашифровать получившуюся строку еще раз с помощью DES-CBC, но используя последний блок предыдущего шага как ключ шифрования.

Графически это выглядит следующим образом:

Обозначим шифрование строки Х на ключе K как DES(X,K). Тогда, в аналитической форме уравнение шифрования выглядит так:

H = DES(UPPER(ЛогинПароль), DES(UPPER(ЛогинПароль), K))(1)

Если обозначить UPPER(ЛогинПароль) =Х, то уравнение станет совсем простым:

H=DES(X,DES(X,K))    (2)


Обратную операцию (расшифрование H на ключе K) обозначим так: X=DES-1(H,K).

Алгоритм шифрования DES определен для 56-битового ключа, но не во всех версиях СУБД Oracle выдерживается значение 56 бит. В силу ограничений экспортного законодательства США в 80-90 гг., запрещающего продавать за рубеж ПО и аппаратуру, содержащие стойкие криптографические алгоритмы, длина ключа для экспортных версий СУБД Oracle искусственно занижалась до 40 бит, что облегчает правительству США чтение шифрованной информации. Признание этого факта содержится, например, в «Oracle Database Advanced Security Administrator's Guide» страница 1-4: «Prior versions of Oracle Advanced Security provided three editions: Domestic, Upgrade and Export, each with different key length. Oracle Advanced Security 10g Release 2 (10.2) contains a complete complement of the available encryption algorithms and lengths, previously only available in the Domestic edition. … The U.S. government has relaxed its export guidelines for encryption products. Accordingly, Oracle can ship Oracle Advanced Security with its strongest encryption features to all of its customers» В последние годы экспортный контроль Гос. Департаментом США был значительно ослаблен, поскольку производители ПО и электроники стали нести слишком большие потери (упущенная выгода), из-за этих ограничений.


Содержание раздела