使用bash、python或其他Linux命令行工具创建dovecot SHA1摘要
我们的dovecot和邮件服务器使用SHA1摘要来验证用户身份。我们现在不能更改这个摘要,因为用户太多了,不想让他们重新设置所有的密码。
我们希望能有一个更简单的方法来为用户创建摘要,并把它放到数据库里(最终还想做一个网页界面,让他们自己可以更改)。
目前,我们是通过Linux命令来创建摘要的:
dovecotpw -s SHA1
我们想要换个方法,因为dovecotpw这个命令不能被脚本化(至少不可以不使用expect或类似的工具)。但是,我尝试过的所有方法(比如sha1sum、mysql的sha1、python的hashlib.sha1)都产生了和dovecotpw命令完全不同的结果。
下面是用不同命令处理“password”这个词的输出结果:
dovecotpw -> W6ph5Mm5Pz8GgiULbPgzG37mj9g=
sha1sum -> 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
python hashlib.sha1() -> 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
mysql sha1() -> 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
所以看起来是dovecot在以不同的方式处理这个问题。不幸的是,我需要的就是这个创建方式。
有没有什么办法可以通过一个可以脚本化的命令来获取dovecot的sha1?
谢谢。
2 个回答
1
dovecotpw的输出是经过base64编码的。
7
你需要把二进制的摘要进行base64编码,这样才能符合他们的格式。
>>> import hashlib
>>> import base64
>>> p = hashlib.sha1('password')
>>> base64.b64encode(p.digest())
'W6ph5Mm5Pz8GgiULbPgzG37mj9g='
补充一下,如果你想通过终端或者bash脚本来做这个,你可以这样操作:
$ echo -n 'password' | openssl sha1 -binary | base64
W6ph5Mm5Pz8GgiULbPgzG37mj9g=
另外,你可以发现dovecotpw不再给出哈希的十六进制表示,因为它的字符中有一些不是十六进制的[0-9a-f]。使用字符[A-Za-z0-9+/]并且以=结尾,说明这是哈希的base64转换。