※ 本文為 dinos.bbs. 轉寄自 ptt.cc 更新時間: 2012-10-16 21:37:15
看板 PHP
作者 標題 [閒聊] hash function
時間 Tue Oct 16 20:16:51 2012
想了好一會兒不知道要下什麼標題...
只是正好上面兩篇提到的東西有些地方意外的有點共通點
所以集合起來一起回一篇 XD
從上上篇的推文起頭好了
: → mervynW:你去看md5第2個參數. 10/16 15:14
: → kerash:我這個功能不會弄到md5,這串資料是要被反解的@_@ 10/16 15:39
: → mervynW:你還是要看看我說得md5第2個參數的意義 10/16 17:23
: → kerash:以 16 進制或 binary 加密,這部分有甚麼問題嗎? 10/16 18:04
md5 的第二個參數是用來把 md5 所算出來的結果其十六進位值直接以二進位字串傳回
也就是說 原先呼叫 md5("")
會得到像是 "d41d8cd98f00b204e9800998ecf8427e" 的字串
當呼叫 md5("",true) 時
得回來的字串直接輸出會得到像是 "?屬??閫 橃鳥~" 這樣的亂碼
用途在於 由於它直接就是 md5 的實際二進位結果
它可以直接餵進一些需要二進位字串的函數 例如 base64_encode 之類的來做轉換
以上述例子為例 那個字串它的每個字的 ascii 依序是 0xd4,0x1d,0x8c,0xd9,... 等等
於是當使用 base64_encode(md5("",true)) 的時候
於是當使用 base64_encode(md5("",true)) 的時候
就可以得到 "1B2M2Y8AsgTpgAmY7PhCfg==" 這個字串
而它正是那個長度為 16 的二進位字串做 base64 的結果
m 版友回文應該只是要指出這一點而已
mcrypt_encrypt 的回傳值其實就是這種東西 (它是回傳加密後的字串)
因此 k 版友你的正確做法是把 $passcrypt 直接餵進 base64_encode
(連 trim 都不用了 -- 用了說不定有時候還會錯)
因此 k 版友你的正確做法是把 $passcrypt 直接餵進 base64_encode
(連 trim 都不用了 -- 用了說不定有時候還會錯)
把結果填到那個欄位中送出
應該就是對方伺服器所需要的東西了
-----------------------------------------------------------------------
這個東西這跟上一篇的問題的關係
在於其實上上篇的 m 版友的回文裡所提到的方法
稍做修改其實就能得到 j 版友所需要的 UUID 產生器了
也就是把直接用 md5 的地方改成 base64_encode(md5(...,true)) 即可
對於所需字元的問題 base64 是使用
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
這 64 個字 跟你要的 - _ 只差在最後兩個
那這可以用 str_replace 解決
也就是變成 str_replace(array("+","/"),array("-","_"),base64_encode(...))
如果要連 base64 的 "=" 也濾掉的話就再加一筆「"=" 換成 ""」即可
而且由於你是要產生 UUID 而不是做什麼加密訊息 用 md5 其實就足夠了
因為 UUID 要的只不過是「產生出一樣的東西機率很小」而已
又不怕別人破解什麼東西
不過如果你還是想換成 SHA-1 的話
sha1() 也有這一個參數可以輸出二進位結果
所以只要把 md5() 換成 sha1() 即可
--
◢ ˊ_▂▃▄▂_ˋ. ◣ ▅▅ ▅▅ ι●╮ █▄▄▄▄▄▄▄▄▄▄
▍./◤_▂▃▄▂_◥ \'▊ HARUHI █████ <■┘ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▎⊿ ◤◤◥█◥◥█Δ ISM By-gamejye ¢|\ ▌▌▌▌▌▄▄▌▌
▏ζ(▏●‵◥′●▊)Ψ ▏ █ ⊿Δ ▄▄▄▄▄▄ ▄▄▄▄▄▄▄
█/|▊ 〃 、 〃▋ |\ ▎ ハルヒ主義 █▄▄▄▄█▄▄▄▄
◥◥|◣ ‵′ ◢/'◢◢S.O.S 世界を大いに盛り上げるための涼宮ハルヒの団
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.218.108.125
※ 編輯: LPH66 來自: 180.218.108.125 (10/16 20:23)
→ :有點不太知道怎麼說明,其實我有一部份的問題在前面轉array1F 10/16 21:27
→ :是不是正確的,因為原始資料第一步是要這麼做。
→ :接著再進到加密的部分,那個 function 是直接抓 sample 的
→ :所以我假定這個加密值是正確的(只是不確定他回來的型態)
→ :之所以對m版友提疑問是md5我裡面完全沒用到= ="
→ :就若是可以產生 binary,我的data也不知道怎麼產生
→ :另外因我認為對方的這個service應該也有問題所以還在等回應
→ :是不是正確的,因為原始資料第一步是要這麼做。
→ :接著再進到加密的部分,那個 function 是直接抓 sample 的
→ :所以我假定這個加密值是正確的(只是不確定他回來的型態)
→ :之所以對m版友提疑問是md5我裡面完全沒用到= ="
→ :就若是可以產生 binary,我的data也不知道怎麼產生
→ :另外因我認為對方的這個service應該也有問題所以還在等回應
--
※ 看板: dinos 文章推薦值: 0 目前人氣: 0 累積人氣: 114
回列表(←)
分享