我在Ubuntu 14.04上安装了Exim 4.80服务器。 我想从Dovecot Auth切换到MySQL。 密码存储为crypt(sha256,以$ 5 $开头)。 扩展看起来像这样:
server_condition = $ {如果crypteq {$ 3} {$ {lookup mysql {select密码来自帐户LEFT JOIN domains ON accounts.domain = domains.id AND domains.domain ='$ {quote_mysql:$ {domain:$ 2}}'WHERE accounts 。名称= '$ {quote_mysql:$ {local_part:$ 2}}'}}} {是} {无}}
当我打开debugging日志,我得到这样的东西:
10科目= $ 5 $ fBzbQG0FRF1Lt2QI $ Nhmrw5gKq62vmHDD8Eov9WCoGRPkk —–删除—-
- Postfix收到邮件时,无法触发我的PHP脚本
- Postfix / Dovecot – 多个域和多个Linux帐户
- 在Linux上从命令行发送邮件与两个不同的服务器上的域有不同的结果
- 交换不检查自己的域的SPFlogging
- 传送状态通知(失败)=> 550 SPF:xxxx(IP地址)不允许从<our-domain.com>发送邮件
10encryption= $ 5 $ fBzbQG0FRF1Lt2QI $ Nhmrw5gKq62vmHDD8Eov9WCoGRPkk —–删除—-
两个删减完全相同。 然后发生以下情况:
10扩展string:不
我在Exim源代码中挖了一遍,发现下面的代码负责debugging消息和crypteq的结果
#define STR(s) # s #define XSTR(s) STR(s) DEBUG(D_auth) debug_printf("crypteq: using %s()\n" " subject=%s\n crypted=%s\n", (which == 0)? XSTR(DEFAULT_CRYPT) : (which == 1)? "crypt" : "crypt16", coded, sub[1]); #undef STR #undef XSTR /* If the encrypted string contains fewer than two characters (for the salt), force failure. Otherwise we get false positives: with an empty string the yield of crypt() is an empty string! */ tempcond = (Ustrlen(sub[1]) < 2)? FALSE : (Ustrcmp(coded, sub[1]) == 0); }
所以subject =是由crypt函数生成的编码variables,而crypted =是sub [1]。 这些都是一样的。 运营商的成功只是依赖于天气sub [1]比两个字符(显然是真的)长,而且它们是相同的(这也应该是真的)。
有人知道为什么会发生这种情况吗?
编辑:这不会发生,如果我没有MySQL查找直接放在括号中的散列。 MySQL似乎有一个扩展失败。
好的,对于其他人来说,这个问题还是存在的:MySQL扩展以某种方式增加了空白(尽pipe在数据库中显然没有)。 为了解决这个问题,将你的MySQL扩展封装在一个substr中,并且使用你的hash长度。 sha256-crypt哈希的一个例子是:
$ {substr {0} {63} {$ {lookup mysql {
那么它应该工作。