我正在使用codeigniter 4。 尝试对视图中的URL ID进行加密时,为什么我的代码显示错误?
视图:
<?php $
encrypter = \Config\Services::encrypter();
$data1 = $value['id_aktivitas'];
$data1 = $encrypter->encrypt($data1);
?>
<a href="<?= base_url('aktivitas/edit_aktivitas/'.$data1) ?>" class="btn btn-warning">Edit</a>
这是我的控制器:
public function edit_aktivitas($id)
{
$encrypter = \Config\Services::encrypter();
$id = $encrypter->decrypt($id);
$data=['aktivitas' => $this->AktivitasModel->edit_aktivitas($id)];
}
这是我的模特:
public function edit_aktivitas($id)
{
return $this->db->table('t_aktivitas')->where('id_aktivitas', $id)->get()->getRowArray();
}
我收到此错误
“ CodeIgniter \ Encryption \ Exceptions \ EncryptionException解密: 身份验证失败。 “
答案 0 :(得分:1)
好吧,我遇到了同样的错误,我试图修复它,所以这对我来说是很好的解决方案。
密钥应该尽可能地随机,并且不能是常规文本字符串,也不能是哈希函数的输出等。要创建正确的密钥,可以使用加密库的createKey()方法。 / p>
// $ key将被分配一个32字节(256位)随机密钥
$key = Encryption::createKey(32);
密钥可以存储在app / Config / Encryption.php中,或者您可以设计自己的存储机制,并在加密/解密时动态传递密钥。
要将密钥保存到app / Config / Encryption.php,请打开文件并设置:
public $key = 'YOUR KEY';
注意:通过复制和过去传递生成的密钥会损坏二进制表示形式,因此请继续阅读
编码键或结果
您会注意到,createKey()方法输出的二进制数据很难处理(即,复制粘贴可能会损坏它),因此您可以使用bin2hex(),hex2bin()或Base64编码 以更友好的方式使用钥匙。例如:
// Get a hex-encoded representation of the key:
$encoded = bin2hex(Encryption::createKey(32));
echo $encoded
如果您使用base64_encode(),请确保在下面的构造函数中以及在加密消息时使用base64_decode()
例如:
// if you use base64_encode do this
$message = 'some message to encode';
$encrypter = \Config\Services::encrypter();
$encodedMsg = base64_encode($encrypter->encrypt($message));
// decrypt the message
$txt = $encrypter->decrypt(base64_decode($encodedMsg))
echo $txt;
// and in your App\Config\Encryption.php Constructor that will
// dynamically decode the key to binary safe use
base64_decode($encodedKey)
// only if you encode the key using the
base64_encode($key)
//And if you use
bin2hex($key)
// during key creation in the constructor use:
hex2bin($encodedKey)
// and when transporting your message over url use:
bin2hex($encodedMessageFromEncrypter->encrypt($msg))
// and decode it using
hex2bin($transportedMessage)
#动态传递密钥 在您的App \ Config \ Encryption.php
中//创建一个构造函数,该构造函数将使用hex2bin()将相同的值动态地放入配置中,
//,以便仍将其作为二进制传递给库: 像这样:
public function __construct(){
//copy the encoded key and pass it in here
$this->key = hex2bin($encoded);
}
然后尝试再次加密和解密文本!
答案 1 :(得分:0)
我也有同样的问题。正如上面 OBI PASCAL BANJUARE 创建 加密密钥 的回答所述,这很重要,但还要注意 $data1 = $encrypter->encrypt($data1);
生成二进制数据。
不要将二进制数据保存在数据库中,而是使用 bin2hex()
或 base64_encode()
(尚未尝试使用 base64)对生成的二进制数据进行编码,然后保存。例如:
加密
encrypter = \Config\Services::encrypter();
$data = 'SOME_TEXT';
$encrypted_data = bin2hex($encrypter->encrypt($data));
解密
$decrypted_data = $encrypter->decrypt(hex2bin($encrypted_data));
echo $decrypted_data;