2012-06-09 219 views
4

我有一些實體(對象),每個都有一個id(唯一)和一個名稱。
當我想要顯示其中之一時,我有一個像www.domain.com/view/key:xxx這樣的網址。
關鍵只是使用base64_encode編碼的實體的id,所以它不是直接從url的id是什麼。php編碼字符串,反之亦然

我現在想要做的事情(由於項目規範)是關鍵字只包含數字和字母(base64_encode提供了一個結果,如eyJpZCI6IjM2In0=eyJpZCI6IjM2In0%3D後url編碼)。

有沒有簡單的替代方案呢?這不是一個高度安全的問題 - 有很多方法可以顯示id,我只需要一個只包含由實體ID(可能與其名稱組合)生成的字母和數字的密鑰,該密鑰可以是解碼讓我返回ID。

我發現的所有不同的編碼方法都可以包含特殊字符。
這裏有什麼幫助嗎?
在此先感謝

回答

6

這樣的回答並沒有真正應用加密,但由於您的問題標有編碼,以及...

自PHP 5中,您可以使用bin2hex

$s = base64_decode('eyJpZCI6IjM2In0='); 
echo bin2hex($s); 

輸出:

7b226964223a223336227d 

解碼:

$s = hex2bin($data); 

或者:

$s = pack('H*', $data); 

順便說一句,如果id是敏感的,你可能要考慮的防篡改它來替代全面的加密。


忘記提到如何可以base64編碼數據的URL安全:

function base64_url_encode($input) 
{ 
    return strtr(base64_encode($input), '+/=', '-_,'); 
} 

function base64_url_decode($input) 
{ 
    return base64_decode(strtr($input, '-_,', '+/=')); 
} 
+0

你會用什麼函數來解碼它? 'hex2bin'? – Steve

+1

@dynamic當然,但你總是可以使用'pack('H *',$ str);'作爲php的替代品<5.3 –

+0

php.net是否爲其他人?我試圖看看hex2bin函數。傑克,謝謝。 – Steve

0

有許多PHP編碼/解碼功能。 你可以找到很多herehere

或者只是在base64_encode的末尾去掉=並將其添加到base64_decode的PHP代碼中以查找ID。

+0

不能只是除掉的「=」,它可能有多個,而我就不會能夠知道在那裏有多少'='... – CrisDeBlonde

+0

@CrisDeBlonde:如果你讓你的ID爲固定長度,比如說用左前填充前導零的ID,那麼你總是會知道有多少'='最後,你可以刪除它們。 –

相關問題