顯示廣告
隱藏 ✕
※ 本文為 dinos.bbs. 轉寄自 ptt.cc 更新時間: 2012-10-16 21:37:15
看板 PHP
作者 LPH66 (杇瑣)
標題 [閒聊] 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)) 的時候


就可以得到 "1B2M2Y8AsgTpgAmY7PhCfg==" 這個字串

而它正是那個長度為 16 的二進位字串做 base64 的結果

m 版友回文應該只是要指出這一點而已

mcrypt_encrypt 的回傳值其實就是這種東西 (它是回傳加密後的字串)

因此 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)
kerash:有點不太知道怎麼說明,其實我有一部份的問題在前面轉array1F 10/16 21:27
kerash:是不是正確的,因為原始資料第一步是要這麼做。
kerash:接著再進到加密的部分,那個 function 是直接抓 sample 的
kerash:所以我假定這個加密值是正確的(只是不確定他回來的型態)
kerash:之所以對m版友提疑問是md5我裡面完全沒用到= ="
kerash:就若是可以產生 binary,我的data也不知道怎麼產生
kerash:另外因我認為對方的這個service應該也有問題所以還在等回應

--
※ 看板: dinos 文章推薦值: 0 目前人氣: 0 累積人氣: 114 
分享網址: 複製 已複製
guest
x)推文 r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇