Я думаю, что это невозможно.
Как говорит @Eir Nym, вы совершенно очевидно не можете перевести, например, хэш MD5 -пароля в хэш SHA -256, не зная пароль.
Однако вы думаете, что сможете перевести SHA -256 хеш (согласно crypt (3 ))в SHA -256 хэш (согласно OpenLDAP ):, безусловно, это просто вопрос идентификации соли и хеша. в одном формате и переупорядочивая их в формат, ожидаемый другим. Нет? Что, не так?!
В OpenLDAP формат атрибута userPassword
, хотя и не вполне задокументирован, относительно прост :это фиксированная -длина хэш пароля, за которым следует соль (, см., например, contrib/slapd-modules/passwd/sha2
в OpenLDAP источники). Это также очевидно в примечаниях, таких как этот OpenLDAP FAQ -o -matic статья , в которой показано, как сгенерировать {SSHA}
хэш из пароля + соли.
Однако для систем, использующих шифрование (3 ), вы увидите «хэши паролей». формы
$id$salt$hash
, где $5$
указывает SHA -256, $6$
указывает SHA -512 и так далее. То hash
элемент, который является закодированной в base64 формой некоторого функция ключа, соли и (в некоторых вариантах )номер шифрования раундов, но фактическая функция... не задокументирована.
[.-]
могут появляться в строка base64 без указания, что это такое ). Итак, мы можем посмотреть на исходники glibc для склепа. Там мы обнаруживаем (в crypt_util.c
), что base64 алфавит действительно нечетный, используя "./0-9A-Za-b"
, а не более обычный (и PHC -указанный)"A-Za-z0-9+/"
(с редкими вариантами в последние два символа ). Бесполезно, но мы могли бы справиться, если бы это было единственная разница.
Однако функция sha256-crypt.c
в этой библиотеке (, например )берет ключ и соль и делает что-то очень странное и длинное -запутанное с ними для получения значения hash
. я бы не стал рисковать мнение о том, разумно ли то, что он делает,но это точно не простой.
Это означает, что хотя crypt (3)$5$
и OpenLDAP ‘SHA -256’ хэши на первый взгляд с использованием одного и того же криптографического примитива, на самом деле они используют его настолько по-разному, что они составляют разные хэш-функции , так что, как и в случае с точкой в наверху, вы не можете перевести одно в другое, не зная пароль. То же самое можно сказать и о паролях $6$
/SHA -512.
Это очень раздражает.
Примечание в скобках:Как оказалось, можно преобразовать «хэши» $1$
/SMD5 между форматом crypt (3 )и форматом OpenLDAP :
.
$1$salt$hash
соответствует
'{SMD5}' + hash + salt
где +
— простая конкатенация строк. Но мы, вероятно, не должны использовать Хэши MD5 больше не используются, так что это не очень помогает.
Также обратите внимание, что вы можете перенести свои крипто-(3 )хэша в OpenLDAP без изменений, используя
{CRYPT}$1$salt$hash
если ваша libc совместима(что обычно бывает, если OpenLDAP работает в Linux ), но OpenLDAP не будет генерировать новые пароли таким образом, так что это -улица с односторонним движением.