我需要将旧目录(如 Mysql)数据迁移到新的 ldap 数据库。除了密码之外,没有太多麻烦。它们以 sha1 形式存储在 Mysql 数据库中(我检查过我可以通过输入“ echo -n "cleartextpassword" | openssl dgst -sha1
”来生成它们)。
问题是我无法将它们导入到我们的 openldap 服务器中。
我担心这里可能存在两个问题。
首先是加密/编码问题:这种 sha1 编码在 ldap 中是否可以用?
接口问题:当我使用ldapadd
或ldapmodify
输入/更新字段时userPassword
,ldif 文件中提供的数据会被重新加密。是否有可能以某种方式绕过这个问题?
提前致谢
答案1
经过多次尝试后,我终于明白了。
我拥有的 sha1 字符串是所谓的十六进制摘要。为了将它们放入 openldap,我首先需要将它们转换回二进制 sha1 摘要,然后对其进行 base64 编码。
在命令行上可以这样做:
echo -n "sha1-hex-digest" | xxd -r -p | openssl enc -base64
然后应按以下方式将结果字符串插入 ldif 文件中:
userPassword: {SHA}base-64-blurb
对于那些感兴趣的人,可以这样用 Python 来完成:
import base64
import binascii
sha1_pwd = "your-sha1-hex-digest-here"
ldap_pwd = base64.b64encode(binascii.unhexlify(sha1_pwd)).decode('utf-8')
print("userPassword: {SHA}%s" % ldap_pwd)
答案2
在我的例子中,我希望导入 Linux 用户帐户的加密加盐 SHA-512 算法哈希。因此,我发现(答案)什么是 {CRYPT} 密码以及如何生成它们?其中有更多细节,但基本上你所要做的就是{CRYPT}
在通常的哈希前面添加类似的东西$6$salthere$base64hashhere
。
在该链接中,他们说要使用一些 perl 库来生成哈希值。除了测试之外,您不需要执行其中的任何命令来生成任何东西。(但您可以使用ldapmodifyuser
或另一个基于 ldif 的命令(他们没有提到)来实际导入密码)。但它对于查看正确的语法($1$salt...
即 md5crypt)很有用:
$ perl -e 'use Crypt::PasswdMD5;print("userPassword: {CRYPT}".unix_md5_crypt("password","salt")."\n");'
userPassword: {CRYPT}$1$salt$qJH7.N4xYta3aEG/dfqo/0
但是没有正确的算法(即 sha512crypt,类似于$6$salt...
)。有一个perl-crypt-passwdmd5
包但没有sha2
或sha512
,所以我使用 mkpasswd 进行了测试:
$ mkpasswd -S "saltsalt" -m SHA-512 secret
$6$saltsalt$TVLlQcbpFVof5W3Yz4DTP6gRstiNuHwwTt6GLc1E5n0U0aDehy0S5knV8wiOQSpT0Y77vwPZN.Pq.H91p5hVO1