[轉]PHP base64_encode 在URL地址參數編碼上使用


因為我使用公鑰,使用php的 openssl 加密之后的資料 base64_encode()字符串,然后放入請求 url 中當作參數,urlencode(base64_encode()),然后用 urldecode() 傳過來的參數,出現+=丟失的情況,導致 openssl 解密base64_decode()的字符串失敗。

我們知道Base64是網絡上最常見的用於傳輸8Bit字節代碼的編碼方式之一,看好是編碼,並不是加密。
編碼過程不解釋了,Base64要求把每三個8Bit的字節轉換為四個6Bit的字節(38 = 46 = 24),然后把6Bit再添兩位高位0,組成四個8Bit的字節,也就是說,轉換后的字符串理論上將要比原來的長1/3。

格式是大小寫字母、數字、“=”號、“+”號和“/”號
但“=”等號最多只有兩個
正則匹配就是 【 [a-zA-Z0-9=+/]+ 】
所以看到有大小寫字母的字符串並且有一個或兩個等號結束的。基本可以判斷是base64編碼
base64不適合直接放在URL里作為參數傳輸,發現base64編碼中有“/” “=”符號。為解決此問題,可采用一種用於URL的改進Base64編碼,它不在末尾填充'='號,並將標准Base64中的“+”和“/”分別改成了“_”和“-”,這樣就免去了在URL編解碼和數據庫存儲時所要作的轉換。

通過下面的函數,完美解決base64編碼url的問題了:

//url base64編碼
function urlsafe_b64encode($string) {
    $data = base64_encode($string);
    $data = str_replace(array('+','/','='),array('-','_',''),$data);
    return $data;
}

//url base64解碼
function urlsafe_b64decode($string) {
    $data = str_replace(array('-','_'),array('+','/'),$string);
    $mod4 = strlen($data) % 4;
    if ($mod4) {
        $data .= substr('====', $mod4);
    }
    return base64_decode($data);
}
References
  1. PHP BASE64_ENCODE 在URL地址參數編碼上使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM