Php 加密mysql数据并通过超链接,然后在下一页解密?
我使用以下加密方法对MySQL数据/字符串进行加密,如下所示:Php 加密mysql数据并通过超链接,然后在下一页解密?,php,mysql,encryption,hyperlink,Php,Mysql,Encryption,Hyperlink,我使用以下加密方法对MySQL数据/字符串进行加密,如下所示: $string = $row['reference']; $secret_key = "PlowFish"; // Create the initialization vector for added security. $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND); // En
$string = $row['reference'];
$secret_key = "PlowFish";
// Create the initialization vector for added security.
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
// Encrypt $string
$encrypted_string = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secret_key, $string, MCRYPT_MODE_CBC, $iv);
然后我通过一个超链接传递加密字符串,如下所示:
<a href="ns_application.php?ns_request='.$encrypted_string.'"><p>Click'</p></a>
然后,我尝试解密字符串并将原始值回显到下一页,如下所示:
$enc = $_GET['ns_request'];
$secret_key = "PlowFish";
// Create the initialization vector for added security.
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
$decrypted_string = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $secret_key, $enc, MCRYPT_MODE_CBC, $iv);
Your reference is: <?php echo $decrypted_string; ?>
$enc=$\u GET['ns\u request'];
$secret_key=“PlowFish”;
//创建初始化向量以增加安全性。
$iv=mcrypt_create_iv(mcrypt_get_iv_size(mcrypt_RIJNDAEL_256,mcrypt_MODE_ECB),mcrypt_RAND);
$decrypted_string=mcrypt_decrypt(mcrypt_RIJNDAEL_256,$secret_key,$enc,mcrypt_MODE_CBC,$iv);
你的推荐信是:
但是,这不起作用,因为它仍然是加密值而不是解密值。请有人告诉我哪里出了问题。谢谢您可能希望在发送url之前对数据进行base64_编码,然后在尝试使用mcrypt解密之前进行base64_解码。加密文本包含的字符不是url安全的,因此会被破坏
$string = $row['reference'];
$secret_key = "PlowFish";
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
$encrypted_string = base64_encode( mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secret_key, $string, MCRYPT_MODE_CBC, $iv) );
$enc = base64_decode( $_GET['ns_request'] );
$secret_key = "PlowFish";
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
$decrypted_string = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $secret_key, $enc, MCRYPT_MODE_CBC, $iv);
Your reference is: <?php echo $decrypted_string; ?>
$string=$row['reference'];
$secret_key=“PlowFish”;
$iv=mcrypt_create_iv(mcrypt_get_iv_size(mcrypt_RIJNDAEL_256,mcrypt_MODE_ECB),mcrypt_RAND);
$encrypted_string=base64_encode(mcrypt_encrypt(mcrypt_RIJNDAEL_256,$secret_key,$string,mcrypt_MODE_CBC,$iv));
$enc=base64_解码($_GET['ns_request']);
$secret_key=“PlowFish”;
$iv=mcrypt_create_iv(mcrypt_get_iv_size(mcrypt_RIJNDAEL_256,mcrypt_MODE_ECB),mcrypt_RAND);
$decrypted_string=mcrypt_decrypt(mcrypt_RIJNDAEL_256,$secret_key,$enc,mcrypt_MODE_CBC,$iv);
你的推荐信是:
老实说,我没有测试上面的enc/解密,现在我可以看到它仍然是垃圾。这里有一个小类,你可以使用,如果你想
class encryption{
private $config;
public function __construct( $options=array() ){
$this->config=array_merge(
array(
'cipher' => MCRYPT_RIJNDAEL_256,
'mode' => MCRYPT_MODE_ECB,
'key' => FALSE,
'iv' => FALSE,
'size' => FALSE,
'base64' => TRUE,
'salt' => FALSE
),
$options
);
}
private function getivs( $config=object ){
$config->size=mcrypt_get_iv_size( $config->cipher, $config->mode );
$config->iv=mcrypt_create_iv( $config->size, MCRYPT_RAND );
}
public function encrypt( $data=NULL ){
$config=(object)$this->config;
$this->getivs( $config );
$data=trim( $data );
$module = mcrypt_module_open( $config->cipher, '', $config->mode, '' );
mcrypt_generic_init( $module, $config->key, $config->iv );
$output = $config->base64 ? base64_encode( mcrypt_generic( $module, $data ) ) : mcrypt_generic( $module, $data );
mcrypt_generic_deinit( $module );
mcrypt_module_close( $module );
return $output;
}
public function decrypt( $data=NULL ){
$config=(object)$this->config;
$this->getivs( $config );
mb_detect_order( 'auto' );
$encoding=mb_detect_encoding( $data );
if( !$data or is_null( $data ) or empty( $data ) or !$encoding or $data=='' or base64_decode( $data )=='' ) return FALSE;
$module = mcrypt_module_open( $config->cipher, '', $config->mode, '' );
mcrypt_generic_init( $module, $config->key, $config->iv );
$output = $config->base64 ? rtrim( mdecrypt_generic( $module, base64_decode( $data ) ),"\0" ) : rtrim( mdecrypt_generic( $module, $data ),"\0" );
mcrypt_generic_deinit( $module );
mcrypt_module_close( $module );
return urldecode( $output );
}
}//end class
像这样使用它:-
$enc=new encryption( array( 'key'=>'PlowFish' ) );
$encrypted_string = $enc->encrypt( $string );
echo $encrypted_string.BR;
$decrypted_string=$enc->decrypt( $encrypted_string );
echo $decrypted_string.BR;
谢谢你的反馈,我对php真的很陌生,所以对可用的加密类型不太了解。请您能给我提供一点关于如何使用base64编码的更多想法吗?$data=$urlsafe=base64_编码($data);谢谢你,我设法让这个工作,但无论如何,你可以增加这个加密字符说16位,而不仅仅是7左右显示atm?例如,这可以增加到base85吗?base64_编码不是加密-它只是确保数据可以通过http传输而不会被破坏。加密是用mcrypt完成的,因为您使用的是256bit加密,它看起来相当安全。抱歉,我刚才讲了一些完全不同的东西,我用了完全错误的方式构造了代码,但现在看一下您的示例,我知道哪里出了问题。感谢您的帮助只是一个观察:您是否考虑过会话,并发现它们不可行?会话(或其他基于令牌的机制,带有服务器端存储)将是一种在页面之间传递数据而不让用户查看或编辑数据的简单得多的方法。我得到以下MySQL错误:调用成员函数decrypt()在此行的非对象上:$decrypted_string=$enc->decrypt($encrypted_string)@RamRaier nevermind我成功了,拼错了一封信,非常感谢你的帮助!