【问题标题】:Encrypt Object via Laravel 5.7 PHP and Decrypt via VueJS Javascript通过 Laravel 5.7 PHP 加密对象并通过 VueJS Javascript 解密
【发布时间】:2019-07-18 18:28:10
【问题描述】:

我有一个 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

【问题讨论】:

  • 看看here
  • 感谢工作!现在只需要弄清楚如何使用与 LARAVEL_APP_KEY 不同的密钥进行加密。 - 谢谢!
  • 请注意,当您执行此操作时,客户端将收到加密密钥,这意味着任何收到该密钥的用户都可以解密具有相同密钥的所有个加密字符串。如果您想这样做,请为每个用户生成一个随机加密密钥并将其存储在数据库中。
  • 谢谢@apokryfos

标签: javascript php laravel encryption cryptojs


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的回复,以便澄清。我有一个使用 ElectronJS 编译为桌面应用程序的 VueJS 应用程序。此应用程序是一个离线应用程序,我想要一种快速的方法来生成使用 12 个月后到期的许可证。这个想法是在客户端(符合.exe)中解密许可证并在日期进行检查。同样,这是一种超级简单的方法,但它并不太安全。
  • 我还要补充一点,我不想在本地数据库中存储可以轻松编辑的原始日期。
  • 也许您可以有日期,但为了确保它不会被编辑,您还可以存储签名吗?这样,只要签名有效,您就知道日期没有被修改。
  • 我想了解更多关于这个概念的信息?你有一些上下文的链接吗?我会有一个谷歌 - 谢谢
【解决方案2】:

这是一个从 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) 中的 APP_KEY 但删除 'Base64' 文本:

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));


  })
},

【讨论】:

  • 你不应该公开你的应用密钥。
  • 正如@max 所说,应用程序密钥不应公开。而不是使用使用应用程序密钥的Crypt,您应该使用new \Illuminate\Encryption\Encrypter($key),其中$key 需要为AES-128-CBC 的16 个字符和AES-256-CBC 的32 个字符。然后就可以在vue中使用这个key了
猜你喜欢
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多