Как сгенерировать LDAP-совместимый пароль
Пароли для OpenLDAP-аккаунтов хранятся в
определённом формате.
Для Unix-like систем проект OpenLDAP поставляет утилиту
slappasswd(8)
, которую большинство дистрибутивов упаковывают вместе с самим
slapd
.
Однако, пользователям нужно удобно для себя как-то передавать нам пароли в хешированном и солёном виде, а ставить целый
slapd
неохота.
Вот скрипт на Python 3, которым можно сгенерировать нужное представление пароля с солью.
Он опирается только на стандартную библиотеку, ничего доустанавливать не нужно.
Достаточно просто сохранить его в файл и запустить; он запросит пароль с терминала при помощи
getpass(3)
(т. е. явно откроет
/dev/tty
, выключит эхо на время ввода, ...), и по умолчанию создаст хеш со случайной 16-байтной солью.
#!/usr/bin/env python3
"""Generate a rfc2307-compliant Seeded SHA1 hash
of a provided password, with a non-empty seed,
to be used as a userPassword value.
"""
import os
import sys
from base64 import encodebytes as b_64
from hashlib import sha1
from random import randbytes
def rfc2307_ssha(secret: bytes, salt: bytes) -> str:
if not salt:
raise ValueError("Empty salt is not supported")
ho = sha1()
ho.update(secret)
ho.update(salt)
blk = b_64(ho.digest() + salt).rstrip(b'\n')
return '{SSHA}' + blk.decode()
if __name__ == '__main__':
from getpass import getpass
try:
salt = os.fsencode(sys.argv[1])
except IndexError:
salt = randbytes(16)
pw = getpass().encode()
print(rfc2307_ssha(pw, salt))