Алгоритм
Как описано в документации, в СУБД Oracle для создания паролей может использоваться следующий набор символов:
- цифры '0123456789',
- буквы 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
- символы !"#$%&()`*+,-/:;<=>?_.
Поскольку все символы преобразуются к верхнему регистру, то мощность алфавита паролей равна 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$.
В [] этот алгоритм описан так:
- Конкатенировать логин и пароль пользователя (обозначим эту операцию ).
- Преобразовать полученную строку к верхнему регистру (UPPER(ЛогинПароль)).
- Если в ОС используется однобайтовая кодировка, то преобразовать каждый символ в двухбайтовый, заполнив старший байт нулями (0x00).
- Зашифровать получившуюся строку (дополняя ее нулями до длины блока), используя алгоритм DES в режиме CBC с фиксированным ключом, значение которого есть 0x0123456789ABCDEF.
- Зашифровать получившуюся строку еще раз с помощью 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» В последние годы экспортный контроль Гос. Департаментом США был значительно ослаблен, поскольку производители ПО и электроники стали нести слишком большие потери (упущенная выгода), из-за этих ограничений.