extmail默認密碼加密方式是md5crypt,可是有些時候會遇到這樣的問題——老的郵件系統中的用戶密碼是md5加密的。php
此時須要將extmail的密碼加密方式修改成md5,經過官方解釋(md5和md5crypt沒有區別),修改成plain-md5便可。可是,這隻解決了web登錄的驗證問題,沒有解決smtp以及pop3的驗證問題。mysql
經過 http://www.extmail.org/forum/viewthread.php?tid=3175 帖子解決了驗證問題,內容摘錄以下:web
courier-authlib的auth_generic手冊裏提到crypted密碼的格式支持3類:
1)傳統的crypted 的密碼,如crypt()或md5-salted的密碼
2){MD5}爲前綴,後面是base64編碼後的md5密碼
3){SHA}爲前綴(實際還支持{SAH256},這個看source知道)後面是base64編碼的sha密碼
如何能實現2呢?在目前的extmail/extman實現裏,md5密碼只支持以16進制形式存在的密碼,例如:
sql
d41d8cd98f00b204e9800998ecf8427e
通過base64編碼後依然沒法經過authlib的認證,後來仔細看Digest::MD5手冊裏的介紹,發現md5函數返回的是二進制的、產度爲16個字節的密文,而md5_hex(也就是目前extmail/extman使用的)是其16進制的形式(長度32個字節)。
因而測試用md5函數產生md5密文並用base64編碼後,加上{MD5}前綴,塞到mysql裏,發現經過了authtest的測試!再查看了一下courier-authlib的checkpasswd.c及checkpasswdmd5.c和md5目錄下的md5加密函數,證明了就是校驗二進制+base64編碼後的md5密文,而不是hex後的密文。
問題是如何從hex格式的密文轉成binary格式?不少用戶從其餘系統轉到ext*下時,密碼大可能是md5 hex格式的,因而編寫以下代碼實現轉換:
ide
use MIME::Base64;
my $s = 'd41d8cd98f00b204e9800998ecf8427e';
$s =~ s/(..)/bin($1)/ge;
$s = '{MD5}'.encode_base64($s);
$s =~ s/\s+//; # remove newline
print $s, "\n";
sub bin {
my $n = shift;
sprintf("%c", hex($n));
}
這樣常規的md5密文就被轉成符合要求的{MD5}XXXXX格式了。剛纔這個腳本的執行結果:
函數
{MD5}1B2M2Y8AsgTpgAmY7PhCfg==