2011年5月26日 星期四

sha1 hash encoded in base64

到了報稅的季節,幫家人安裝報稅軟體的時候發現有提供 SHA1 驗證檔,點進去一看,應該是以 base64 編碼,在 Windows 下有安裝 Python 2.7 ,就直接解碼看看( 沒想到 Python 內建的 IDLE 那麼難用,已經習慣 shell 裡按上下鍵叫出之前的指令了... ),解開一看發現真的是 hash (註一),沒有轉成一般可見的文字,跟以前看過的驗證碼(註二)不一樣 ,還以為是我下錯指令或編碼不是 base64 ,翻了說明文件才發現是我見識淺薄,用 hashlib 的 hash.digest() 就可以得到相同結果,使用 hash.hexdigest() 才會得到一般的驗證碼,但是這串文字又不能直接 decode("hex"),在 Python 裡面 decode("hex") 或 encode("hex") 都是已經轉碼好了(註三),身為一個懶得思考的傢伙,就直接跑去看人家 hashlib 原始碼是怎麼寫的,結果人家是用 C 寫的,後來又發現 binascii 這個 module 可以直接用 hexlify 這個 function 轉換字串,又跑去看原始碼,看到註解還真有點囧
/* make hex version of string, taken from shamodule.c */

for(i=j=0; i<sizeof(digest); i++) {
char c;
c = (digest[i] >> 4) & 0xf;
c = (c>9) ? c+'a'-10 : c + '0';
hex_digest[j++] = c;
c = (digest[i] & 0xf);
c = (c>9) ? c+'a'-10 : c + '0';
hex_digest[j++] = c;
}

沒想到我連這麼簡單的字元轉換都記不起來,還用
bin( ord("a") >> 4 & 0xf )
配合 ascii 表查了一下才瞭解這段程式
算 hash 的時候還忘記要用 binary mode 讀檔...Orz

後來寫了一小段 script 來比對驗證碼是否符合,如果明年幫忙安裝報稅軟體的時候可以拿來用 ( 感覺機會不大 XD ),最後要抱怨一下,這 "個人綜合所得稅電子結算申報程式" 真是他媽的難用,難用到我只是幫家人操作讀取檔案和列印單據就想摔滑鼠的程度。


註一\xe6@\x0e\x86\xdeD\xdeW\x87\xf8\t\x9c=o\xee\xd3\xdcw\xdc
註二
60e6400e86de44de5787f8099c3d6feed3dc77dc
註三"abc".encode("hex") == "616263"

沒有留言: