PHP 處理 Base64 URL 的編碼、解碼方式

PHP 使用 Base64 來做編碼(Encode)、解碼(Decode) 是很簡單的,使用下述兩個 Function 即可:

而 Base64 編碼的結尾都會有等號(=),若看到 Base64 沒有等號的話,要怎麼處理呢?

PHP 處理 Base64 URL 的編碼、解碼方式

Base64 結尾沒有等號(=),最有可能是使用「Base64 URL」的編碼方式,主要是在 URL 傳輸時,「/、+、=」都是很容易有問題的 (註:可以用 urlencode() 避開),所以為這些符號特地做點處理。

詳見此說明:Base64 - 維基百科

  • 標準的 Base64 並不適合直接放在 URL 裡傳輸,因為 URL 編碼器會把標準 Base64 中的 / 和 + 字元變為形如 %XX 的形式,而這些 % 號在存入資料庫時還需要再進行轉換,因為 ANSI SQL 中已將 % 號用作通配符。
  • 為解決此問題,可採用一種用於 URL 的改進 Base64 編碼,它不在末尾填充 = 號,並將標準 Base64 中的 + 和 / 分別改成了 - 和 _,這樣就免去了在URL編解碼和數據庫存儲時所要作的轉換,避免了編碼信息長度在此過程中的增加,並統一了資料庫、表單等處對象標識符的格式。

於是除了 base64encode()、base64_decode() 外,針對沒看到等號的,可以試試看用下述 base64url 來處理看看。

<?php
function base64url_encode($data) {                                                                                                                                           
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');                                                                                                              
}                                                                                                                                                                            
                                                                                                                                                                             
function base64url_decode($data) {                                                                                                                                           
    return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));                                                                          
}                                                                                                                                                                            
                                                                                                                                                                             
// Example                                                                                                                                                                   
// $data = 'abcdefghi';                                                                                                                                                      
// $encode = base64url_encode($data);                                                                                                                                        
// echo $encode . "\n";                                                                                                                                                      
// $data = base64url_decode($encode);                                                                                                                                        
// echo $data . "\n";                                                                                                                                                        
?>

註:Base64 URL encode 將 + 換成 -、/ 換成 _,再移除最後面的等號(=)

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料