我需要将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),你可能会让你的生活变得更容易。 –