因為我使用公鑰,使用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);
}