codeigniter 解密显示验证失败错误

yyhrrdl8  于 2022-12-06  发布在  其他
关注(0)|答案(5)|浏览(160)

我正在使用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\加密\异常\加密异常解密:验证失败。“

sczxawaw

sczxawaw1#

好吧,我遇到了同样的错误兄弟,我试图修复它,所以这是我的解决方案,为我工作得很好。
1.在设置启动密钥后创建新密钥@ App\Config\Encryption. php
1.创建编码密钥:设置您的加密密钥您的加密密钥的长度必须与所使用的加密算法允许的长度相同。对于AES-256,长度为256位或32字节(字符)。
密钥应尽可能随机,并且不能是常规文本字符串,也不能是散列函数的输出等。要创建正确的密钥,可以使用Encryption库的createKey()方法。
// $key将被分配一个32字节(256位)的随机密钥

$key = Encryption::createKey(32);

密钥可以存储在app/Config/Encryption.php中,或者您可以设计自己的存储机制,在加密/解密时动态传递密钥。
要将您的密钥保存到app/Config/Encryption.php,请打开该文件并设置:

public $key = 'YOUR KEY';

注意:通过复制和粘贴将生成的密钥传递到此处将损坏二进制表示,因此请继续阅读以下内容

编码键或结果

你会注意到createKey()方法输出的是二进制数据,这很难处理(即复制粘贴可能会损坏它),所以你可以使用bin 2 hex()、hex 2bin()或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中动态传递密钥

//创建一个构造函数,该构造函数将使用hex 2bin()动态地将相同的值放入配置中,
//以便它仍以二进制形式传递到库:就像这样:

public function __construct(){
   //copy the encoded key and pass it in here
   $this->key = hex2bin($encoded);
}

然后尝试再次加密和解密文本!

l3zydbqr

l3zydbqr2#

我也遇到了同样的问题。正如上面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;
rekjcdws

rekjcdws3#

OBI PASCAL BANJUARE已经很好地解释了这个答案。为了用更简单的方式解释它,我喜欢分享我的答案。希望它能在未来帮助其他人。
1.在配置中〉Encryption.php文件
public $key = '1234567890111213';
//如果块大小为16,则您的密钥长度为16个字,可以是任何字符串
公共$块大小= 16;
1.在控制器或视图中使用它,您可以在其中尝试访问它以进行加密或解密
$encrypter = \Config\Services::encrypter();
1.编码您的值

$co = bin2hex($encrypter->encrypt($co_id));
$emp = bin2hex($encrypter->encrypt($emp_id));

1.解码您的值

$co = $this->encrypter->decrypt(hex2bin($co_id));
$emp = $this->encrypter->decrypt(hex2bin($emp_id));

:加密时使用bin2hex,解密时使用hex2bin

a14dhokn

a14dhokn4#

看来解决这条消息的方法不同。
可能的解释和此刻青睐。
DB-lenghts,这也被描述为GitHub上的解决方案(所以竖起大拇指ihsan)。
在我的例子中,我进入这个页面是因为同样的错误,但我的解决方案是错误的解码步骤

bin2hex(encode($data));

hex2bin(decode($data));

但正确的是

decode(hex2bin($data));
    • 所以看起来,这主要是一个问题,与传入的字符串,我们将解码。**
mepcadol

mepcadol5#

增加数据库中密码字段长度。可能会解决您的错误

相关问题