繁体   English   中英

通过 Laravel 5.7 PHP 加密对象并通过 VueJS Javascript 解密

[英]Encrypt Object via Laravel 5.7 PHP and Decrypt via VueJS Javascript

我有一个 Laravel 5.7 应用程序,它加密一个对象并将加密的对象返回给我的 VueJS 应用程序。

请注意,下面的代码是为了说明目的,我不是这样使用的,但是,这个概念是。

路由触发的 Laravel 函数

public function license() {
  var data = [{id: 1}, {expiry_date: '2019-02-25T10:47:12+00:00'}];
  $encrypted = \Crypt::encrypt(JSON.stringify(data));
  return $encrypted;
}

Vue JS 获取对象的方法

checkLicense() {
      this.$http.get(LARAVEL_ROUTE).then(res => {
        var key = 'LARAVEL_APP_KEY'; // NOT REAL
        var bytes = CryptoJS.AES.decrypt(res.data, 'LARAVEL_APP_KEY');
        var plaintext = bytes.toString(CryptoJS.enc.Utf8);
      });
}

以上产生以下结果:

未捕获(承诺)错误:格式错误的 UTF-8 数据

我尝试过的事情:

  • 我已经检查了 LARAVEL_APP_KEY 并且我可以看到它以“base64:”为前缀,所以我尝试从我声明密钥的VueJS方法中删除它,但这没有区别。

  • 我还删除了该对象并尝试加密产生与上述相同结果的字符串。

补充问题:

我还想用 LARAVEL_APP_KEY 以外的东西加密字符串/对象,因为我不想将该值存储在我的 VueJS 应用程序中。 密钥不需要超级安全,但我宁愿不使用 LARAVEL_APP_KEY

根据我的经验,我建议如下。

首先,我不确定您为什么要在服务器上加密数据,然后在客户端解密。 我能看到的唯一好处是防止 MITM 攻击,在这种情况下,您应该使用 SSL。

其次,我相当确定加密密钥是前缀base64:之后的 base64 编码值。 因此,在尝试使用密钥解密之前,您需要删除它,然后在 VueJS 中对剩余的字符串进行 base64 编码。

在回答您关于使用 APP_KEY 以外的任何内容进行加密/解密的问题时,您不能有多个密钥来解密相同的值。 密码学只有在您拥有正确的密钥时才有效。

我真的不建议在客户端解密数据,然后任何人都可以获得您的加密密钥,如果其他地方存在漏洞并且能够访问您的数据库,他们可以解密他们喜欢的任何数据。

这是从 Laravel 加密并使用 vueJS 解密的示例

Laravel

use Illuminate\Support\Facades\Crypt;

public function encrypting(){

$string = 'This is example text';
$user = User::get();
// for simple string
$encrypted = Crypt::encryptString($string);
 
// for array , object
$encrypted2 = Crypt::encryptString(json_encode($user));

$response = [
    'user' => $user,
    'encrypted' => $encrypted,
    'encrypted2' => $encrypted2
];
}

动作前端服务器

npm install crypto-js

VueJS

关键是在.ENV(laravel),但删除“Base64编码”文本APP_KEY:

import CryptoJS from "crypto-js";

   Decrypting() {
   axios.get('http://back.domain.com/encrypting').then(response => {
    this.user = response.data.user;
    this.stringEncrypte = response.data.encrypted;
    this.userEncrypte = response.data.encrypted2;
    
    var key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx='
    var encrypted_json = JSON.parse(atob(this.userEncrypte));
    var decrypted = CryptoJS.AES.decrypt(encrypted_json.value, CryptoJS.enc.Base64.parse(key), {
      iv: CryptoJS.enc.Base64.parse(encrypted_json.iv)
    });
    // Decrypt in string format
    this.stringDecrypted = decrypted.toString(CryptoJS.enc.Utf8);

    // Decrypt in Array, Object format
    this.userDecrypted = JSON.parse(decrypted.toString(CryptoJS.enc.Utf8));


  })
},

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM