Php 在URL中使用mcrypted值
我写了一个小类来发送带有url的私有数据(不能使用cookies/sessions或其他任何东西)。我使用PHP的mcrypt对其进行加密/解密,并对其进行base64 en/解码,以便在url中使用 不幸的是,我仍然时不时地得到错误的结果。我注意到,当url中至少出现一个Php 在URL中使用mcrypted值,php,urlencode,mcrypt,Php,Urlencode,Mcrypt,我写了一个小类来发送带有url的私有数据(不能使用cookies/sessions或其他任何东西)。我使用PHP的mcrypt对其进行加密/解密,并对其进行base64 en/解码,以便在url中使用 不幸的是,我仍然时不时地得到错误的结果。我注意到,当url中至少出现一个+时,总是会发生这种情况。我还玩了rawurlencode和urlencode/urldecode,但没有成功。我还尝试了strtr()加密数据,但不知何故,+仍然出现。有人有主意吗 这是我的班级: class crypto
+
时,总是会发生这种情况。我还玩了rawurlencode
和urlencode
/urldecode
,但没有成功。我还尝试了strtr()
加密数据,但不知何故,+
仍然出现。有人有主意吗
这是我的班级:
class crypto
{
public function __construct()
{
$this->iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$this->iv = mcrypt_create_iv($this->iv_size, MCRYPT_RAND);
$this->llave = 'da332sdf9';
}
public function make_crypt($string)
{
$crypt = mcrypt_encrypt(MCRYPT_BLOWFISH, $this->llave, $string, MCRYPT_MODE_ECB, $this->iv);
$crypt = rawurlencode(base64_encode($crypt));
$crypt = strtr($crypt, '+/', '-_');
return $crypt;
}
public function get_crypt($data)
{
$crypt = strtr($crypt, '-_', '+/');
$data = base64_decode($data);
$decrypted = mcrypt_decrypt (MCRYPT_BLOWFISH, $this->llave, $data, MCRYPT_MODE_ECB, $this->iv);
return $decrypted;
}
}
您尝试URL编码“未成功”是什么意思?URL编码值确实有效,否则函数将被破坏。我在我的框架中使用它,没有错误 您确定要对加密值进行编码吗?不要对整个URL进行编码。
$crypt=strtr($crypt,'-'','+/')代码>??在哪里定义了crypt
rawurlencode
解码在哪里
我总是喜欢HEX
,这样我就不必担心url
安全字符了
样本测试您当前的类将失败
溶液输出
用于生成数据的函数
函数生成密码($length=8){
$password=“”;
$mablue=“2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ”;
$maxlength=strlen($maxlength);
如果($length>$maxlength){
$length=$maxlength;
}
$i=0;
而($i<$length){
$char=substr($maxblue,mt_rand(0,$maxlength-1),1);
如果(!strstr($password,$char)){
$password.=$char;
$i++;
}
}
返回$password;
}
我只对加密值进行编码。不知何故,+
不会消失:(你能展示构建URL的代码吗?因为一定有bug。rawurlencode()确实编码+sign.aaarrrrrgh!当我想发布构建URL的代码时,我发现我放了一个错误的urldecode()
在我的修复狂怒中出现在它前面。后来我只坐在crypto类前面,忽略了这一点。现在它在逻辑上可以工作了。谢谢你的提示;)你应该先通过rawurlencode(而不是urlencode)运行IV和加密文本,然后再将其粘贴到链接中。也许看一点旁注,因为您使用的是ECB模式,所以您可以完全忽略IV。它不用于ECB模式。IV仅在CBC模式下使用。
$crypt = new Crypto ();
echo "<pre>";
for($i = 0; $i < 10; $i ++) {
$pass = generatePassword ( mt_rand ( 5, 10 ) );
$test = $crypt->make_crypt ( $pass );
$output = $crypt->get_crypt ( $test );
if ($pass == $output) {
echo " $pass ($test) = $output \n";
} else {
var_dump ( $pass, $output );
echo " $pass ($test) != $output \n";
}
}
class Crypto {
private $iv_size;
private $iv;
private $llave;
public function __construct() {
$this->iv_size = mcrypt_get_iv_size ( MCRYPT_BLOWFISH, MCRYPT_MODE_ECB );
$this->iv = mcrypt_create_iv ( $this->iv_size, MCRYPT_RAND );
$this->llave = 'da332sdf9';
}
public function make_crypt($string) {
$crypt = mcrypt_encrypt ( MCRYPT_BLOWFISH, $this->llave, $string, MCRYPT_MODE_ECB, $this->iv );
return bin2hex ( $crypt );
}
public function get_crypt($data) {
$data = pack ( "H*", $data );
$decrypted = mcrypt_decrypt ( MCRYPT_BLOWFISH, $this->llave, $data, MCRYPT_MODE_ECB, $this->iv );
return trim ( $decrypted );
}
}
tXHhC8fk4 (b929695d39555523348051a72d15baaf) = tXHhC8fk4
drKH9 (909994926fe5cd30) = drKH9
mNwh6K (10af1bb381338943) = mNwh6K
CJZvqwGX (aa705c290759b18d) = CJZvqwGX
Jt4W7j (bc7ee842041b9860) = Jt4W7j
tgCHXyPvm (9f46b74ef59ee70da1dda30b3e52fe92) = tgCHXyPvm
LYxhVj (9e2079cff9d54007) = LYxhVj
kR8WLwh3T (3e4606d65defc74f3c82af5fb095f41d) = kR8WLwh3T
Z8NqWM6RHj (1d9eea2358674d78cc43e024cba5ba48) = Z8NqWM6RHj
TtqRf7M (09ef38114bb729c4) = TtqRf7M
function generatePassword($length = 8) {
$password = "";
$possible = "2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ";
$maxlength = strlen ( $possible );
if ($length > $maxlength) {
$length = $maxlength;
}
$i = 0;
while ( $i < $length ) {
$char = substr ( $possible, mt_rand ( 0, $maxlength - 1 ), 1 );
if (! strstr ( $password, $char )) {
$password .= $char;
$i ++;
}
}
return $password;
}