大半年沒有更新部落格,朋友們在我部落格的留言和提問我也都有看到,鮮少回複,感到十分抱歉。我以為我快要離開IT行業了,近兩年一直在做外包,每天都在趕進度趕進度,感到疲憊的同時,也開始懷疑自己是否對這個行業有足夠的熱情,是否有足夠的天分。但是我知道,我其實還是喜歡挑戰,那種搞定問題後的喜悅,每個程式員應該都會覺得很享受吧。我不確定自己還會在這條路上走多久,但當下,願意走的時候還會好好走。
切入正題,今天遇到一個問題,記錄一下。
手上有一批使用者名稱密碼,密碼是用PHP中的crypt()方法加密過的。而現在,我要在Python的環境裡驗證這個密碼,看看使用者提交的密碼與現有的加密後的密碼是否匹配。怎麼辦?首先要知道PHP裡面對密碼的加密和驗證是怎麼做的。
加密:$PWD = crypt($PASSWORD)驗證:if(crypt($PASSWORD,$PWD) == $PWD)
在PHP中,crypt方法到底用什麼演算法加密(DES還是MD5)會根據作業系統環境的不同而不同的。python中也有crypt方法,我直接按一樣的方式使用這個方法,可惜並不奏效。那麼要想,現有的系統中,到是用了DES還是MD5還是其它呢?這個判斷方法我沒有深究,我在網上看到,不同密碼編譯演算法出來的加密結果,格式上會有分別,如下:
<?phpif (CRYPT_STD_DES == 1) { echo 'Standard DES: ' . crypt('rasmuslerdorf', 'rl') . "\n";}if (CRYPT_EXT_DES == 1) { echo 'Extended DES: ' . crypt('rasmuslerdorf', '_J9..rasm') . "\n";}if (CRYPT_MD5 == 1) { echo 'MD5: ' . crypt('rasmuslerdorf', '$1$rasmusle$') . "\n";}if (CRYPT_BLOWFISH == 1) { echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$rasmuslerd...........$') . "\n";}?>
我的密碼格式是如:$1$7F..C32.$fLd0lxCK.ea3nhEuKcTIP0,我根據格式判斷,現在系統是使用了MD5的演算法。
於是問題的關鍵字就變成 python crypt md5。我找到了下面的方法:
from passlib.hash import md5_cryptverifyed = md5_crypt.verify(passwd, cryptedpwd)
passwd是使用者提交的純文字密碼,cryptedpwd是PHP裡加密過的密碼,如果驗證通過,verifyed就會為true。
使用passlib.hash這個模組,需要先安裝passlib,我一般使用easy_install安裝:easy_install pass lib
OK,記錄到此。