我需要將GET字符串傳遞給電子郵件以允許用戶訪問特定的預訂詳細信息。 即/bookingconformation.php?bookingID=123。瞭解使用base64和mcrypt加密
我想給bookingID使用Base64(編輯和mcrypt的)(希望這將是幾乎不可能的猜測和訪問其他用戶的預訂信息(雖然預訂信息是不是真的過於敏感加密!) )。這樣只有預定用戶才能訪問預訂確認。
我使用的代碼主要在這裏找到(stackoverflow),因爲我遠離加密專家!
我有幾個問題。 我使用的代碼是下面和下面,這是我有
/**
* a basic encryption for things like IDs, so links can be created and emailed to i.e booking details
* @param int/str $x what is to be encrypted
* @ENCRYPTION_KET str the encyption key
* @return encrypted string
*/
public static function basicEncrypt($x, $ENCRYPTION_KET) {
$key = pack('H*', $ENCRYPTION_KET);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $x, MCRYPT_MODE_CBC, $iv);
$ciphertext = $iv . $ciphertext;
$ciphertext_base64 = base64_encode($ciphertext);
$encrypted_x = urlencode($ciphertext_base64);
return $encrypted_x;
}
/**
* a basic de-cryption for things like IDs, so links can be created and emailed to i.e booking details
* @param str $x what is to be de-crypted
* @ENCRYPTION_KET str the encyption key
* @return decrypted string
*/
public static function basicDecrypt($x, $ENCRYPTION_KET) {
$x = urldecode($x);
$ciphertext_dec = base64_decode($x);
$key = pack('H*', $ENCRYPTION_KET);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$iv_dec = substr($ciphertext_dec, 0, $iv_size);
$ciphertext_dec = substr($ciphertext_dec, $iv_size);
$de_crypted_x = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);
return $de_crypted_x;
}
問題1的問題清單:使用basicEncrypt()給出了一個不同的加密字符串每個i使用它(即,對於相同的時間預訂ID爲123)。 只要它解密爲相同,但每次加密字符串是否不相同都無關緊要。如果任何人都可以讓我知道這是否應該每次都返回一個不同的字符串,我也會很感激,如果可以給出一個(容易理解的)解釋爲什麼這是什麼?
問題2: 上面的代碼工作的大部分時間......(也許80%),但其他時候它不會解密正確的答案...我不明白爲什麼:-(如果。任何人都可以讓我知道我在做什麼錯了,所以它工作時間的100%,我將非常感激
問題3:!(可能發行) 我使用進行urlencode()和urldecode()。我有很多關於stackoverflow的內容,並且無法解決,如果我應該使用這個或者不是!我懷疑問題2可能是由這個引起的,但是看不出來,然後做出正確的方法這個和URL是安全的。我曾嘗試用類似下面的東西代替的URLEncode(在這裏),但是這進而導致上述工作的時間
function base64_url_encode($input) {
return strtr($input, '+/=', '-_,');
}
function base64_url_decode($input) {
return strtr($input, '-_,', '+/=');
}
此外 0%是我使用允許的方法用戶看到他們的預訂細節確定/可取? (如上所述,數據不是很敏感,它只包括用戶名,預訂REF和預訂的內容,當用戶打開(酒店)預訂時需要顯示ID)。
任何幫助讓我明白我在做什麼(和加密)好一點是非常感激,甚至更多的讚賞,如果任何人都可以指出(這樣我可以更正)我的方法中的錯誤將是偉大的! !
感謝您看這個:-) 福特
@CharlotteDunois basee64_decode不「解密」(正如你所知)......它解碼。福特:issue1不是問題..每次都會使用隨機的「初始化向量」...導致不同的crypttext –
@BradKent和其他發佈者,我現在看到它有什麼不同......簡單,但我沒有發現它直到它被指出:-) – Ford
如果你使用[defuse/php-encryption](https://github.com/defuse/php-encryption),你可能會讓你的生活變得更容易。 –