Как сгенерировать 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))
Topic revision: r1 - 21 Sep 2023, PorriDed
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding WikiCMC? Send feedback