【问题标题】:Laravel 5 - Decrypt Crypt::encrypt in JavascriptLaravel 5 - 在 Javascript 中解密 Crypt::encrypt
【发布时间】:2015-11-08 14:35:31
【问题描述】:

我正在使用Crypt::encrypt 来加密我的数据并提供给 Javascript 代码。如何在 Javascript 中解密数据?

【问题讨论】:

  • 你为什么要这样做?
  • 找出所有characteristics of the encryption,然后才能尝试复制它。
  • @jedrzej.kurylo 我创建了一个 javascript 游戏,我想将受保护的数据发送到前端以避免用户修改。
  • 即使您将其加密发送,您也必须向 Javascript 提供解密密钥才能解密,因此如果用户愿意,他们将能够解密数据。您应该在服务器端进行所有检查
  • @jedrzej.kurylo 想说的是Javascript Cryptography Considered Harmful

标签: javascript php laravel cryptojs


【解决方案1】:

CryptoJs 和 Laravel 6 & 7.x

.env 文件中放置一个 Mix 变量

MIX_APP_KEY=${APP_KEY}

见:https://laravel.com/docs/7.x/mix#environment-variables

/resources/assets/js/app.js 中添加:

const CryptoJS = require("crypto-js");

window.decrypt = (encrypted) => {
    let key = process.env.MIX_APP_KEY.substr(7);
    var encrypted_json = JSON.parse(atob(encrypted));
    return CryptoJS.AES.decrypt(encrypted_json.value, CryptoJS.enc.Base64.parse(key), {
        iv : CryptoJS.enc.Base64.parse(encrypted_json.iv)
    }).toString(CryptoJS.enc.Utf8);
};

最后在你的脚本中的某个地方你可以像这样解密:

console.log(decrypt(encrypted_text)); 

【讨论】:

  • 说我不会向公众公开我的 APP_KEY 100 次。
【解决方案2】:

我解决了这个问题:

我正在使用 Laravel Framework 5.7.28,我想在我的 node.js 应用程序中解密一些用户密码

对于我的 Js 文件中的解密,我包括 CryptoJSBase64 JS

这是代码:

$key 是您在 .env 文件中的 APP_KEY
$encrypted 是您使用 Crypt::encrypt 加密的内容strong> 在 laravel 中

var CryptoJS = require("crypto-js");
var Base64 = require('js-base64').Base64;


var encrypted = '{{ $encrypted }}';
var key = "{{ $key }}";

var encrypted_json = JSON.parse(Base64.decode(encrypted));


// Now I try to decrypt it.
var decrypted = CryptoJS.AES.decrypt(encrypted_json.value, CryptoJS.enc.Base64.parse(key), {
       iv : CryptoJS.enc.Base64.parse(encrypted_json.iv)
});

console.log(decrypted.toString(CryptoJS.enc.Utf8));

【讨论】:

  • 您可以使用原生atob 函数,而不需要'js-base64' 包。并确保从 laravel 键中删除 base64: 前缀。
【解决方案3】:

使用 laravel 5.1 和 CryptoJS,可以在 (https://code.google.com/p/crypto-js/) 找到。

在 .env 集中:

  1. APP_KEY=uberkeythatrocks

在 config/app.php 中设置:

  1. '密码' => 'AES-256-CBC'

在 MyController.php 中:

  1. $mySecret = "我想对他们隐瞒一些事情";

  2. $encrypted = Crypt::encrypt($mySecret);

在 index.js 中:

  1. var key = "uberkeythatrocks";

  2. var decrypted = CryptoJS.AES.decrypt(encrypted, key);

  3. var 可读 = decrypted.toString(CryptoJS.enc.Utf8);

重要提示: PHP 中的 'key' 必须与 JS 中的 'key' 相同,PHP 中的 'cipher' 必须与 JS 中的相同,但是 CryptoJS 将自动选择 AES-128-CBC 或 AES-256-CBC你的“钥匙”的长度。虽然 laravel 5.1 默认的“密码”是 AES-256-CBC,所以我建议你从 .env 文件中获取“密钥”以在 JS 中使用。

从 Laravel 更改或生成新的“密钥”

  1. C:/mylaravel> php artisan key:generate [enter]

使用 AES-128-CBC

  1. 编辑 config/app.php 并设置 'cipher' => 'AES-128-CBC'

然后

  1. C:/mylaravel> php artisan key:generate [enter]

请注意,更改“密钥”将意味着现有用户帐户的登录密码将无法使用,除非您删除该用户然后创建新用户。

希望这会有所帮助! :)

【讨论】:

  • 有没有办法反过来,在 JS 中加密并在 Laravel 5.1 中解密?我试过了,但我不断收到DecryptException in BaseEncrypter.php line 45:The payload is invalid.
  • 我得到了github.com/brainfoolong/cryptojs-aes-php 的帮助。这是在 Laravel 中使用 cryptjs 的示例代码,它就像一个魅力。
  • 应该从code.google.com/p/crypto-js获取什么文件
  • 为什么在记录我希望给我加密字符串的可读 var 时得到一个
猜你喜欢
  • 1970-01-01
  • 2017-05-23
  • 2016-09-27
  • 1970-01-01
  • 2016-01-03
  • 2018-09-05
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多