繁体   English   中英

JS解密Laravel加密字符串

[英]JS Decrypt Laravel Encrypted String

我必须用 javascript 解密laravel 6加密字符串。键入 laravel .env文件

APP_KEY=base64:Rva4FZFTACUe94+k+opcvMdTfr9X5OTfzK3KJHIoXyQ=

并在config/app.php文件密码设置为以下...

'cipher' => 'AES-256-CBC',

到目前为止我尝试过的内容如下...

Laravel 代码

$test = 'this is test';
$encrypted = Crypt::encrypt($test);

HTML 和 Javascript 代码

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>

var encrypted = 'eyJpdiI6IlB4NG0ra2F6SE9PZmVcL0lpUEFIeVlnPT0iLCJ2YWx1ZSI6IlVMQWJyVjcrcUVWZE1jQ25LbG5NTGRla0ZIOUE2MFNFXC9Ed2pOaWJJaXIwPSIsIm1hYyI6IjVhYmJmZDBkMzAwYzMzYzAzY2UzNzY2';
var key = 'Rva4FZFTACUe94+k+opcvMdTfr9X5OTfzK3KJHIoXyQ='; // this is laravel key in .env file
var decrypted = CryptoJS.AES.decrypt(encrypted, key); 
console.log(decrypted);

上面代码的控制台输出在下面的屏幕截图中给出......

在此处输入图像描述

我已经尝试了很多来自谷歌和堆栈溢出的其他 JS 代码,但没有运气。

更新

这是在单独的离线系统中解密字符串的要求。 我不会在实时网站上使用 javascript 解密。 而使用 java 脚本的解密将在离线系统上完成。

就像@Dusan Malusev 已经提到的那样:

您不应在前端代码中使用 Laravel APP_KEY。 从不,Laravel 使用 APP_KEY 加密所有内容,包括 cookies(会话 cookie 和 csrf cookie)。

如果您的应用程序位于您的 html 代码中,您的应用程序可能会被黑客入侵:稍微回答您的问题:在应用程序的服务器端(在 Laravel 中)使用Crypt::decrypt($encrypted) )。

这就是您如何使用 AES-256-CBC 作为密码解密 javascript 中的文本,该文本使用 Laravel 编码。

使用 CryptoJS 4.0...

// Created using Crypt::encryptString('Hello world.') on Laravel.
// If Crypt::encrypt is used the value is PHP serialized so you'll 
// need to "unserialize" it in JS at the end.
var encrypted = 'eyJpdiI6ImRIN3QvRGh5UjhQNVM4Q3lnN21JNFE9PSIsInZhbHVlIjoiYlEvNzQzMnpVZ1dTdG9ETTROdnkyUT09IiwibWFjIjoiM2I4YTg5ZmNhOTgyMzgxYjcyNjY4ZGFkNTc4MDdiZTcyOTIyZjRkY2M5MTM5NTBjMmMyZGMyNTNkMzMwYzY3OCJ9';

// The APP_KEY in .env file. Note that it is base64 encoded binary
var key = 'E2nRP0COW2ohd23+iAW4Xzpk3mFFiPuC8/G2PLPiYDg=';

// Laravel creates a JSON to store iv, value and a mac and base64 encodes it.
// So let's base64 decode the string to get them.
encrypted = atob(encrypted);
encrypted = JSON.parse(encrypted);

console.log('Laravel encryption result', encrypted);



// IV is base64 encoded in Laravel, expected as word array in cryptojs
const iv = CryptoJS.enc.Base64.parse(encrypted.iv);

// Value (chipher text) is also base64 encoded in Laravel, same in cryptojs
const value = encrypted.value;


// Key is base64 encoded in Laravel, word array expected in cryptojs
key = CryptoJS.enc.Base64.parse(key);

// Decrypt the value, providing the IV. 
var decrypted = CryptoJS.AES.decrypt(value, key, {
  iv: iv
});

// CryptoJS returns a word array which can be 
// converted to string like this
decrypted = decrypted.toString(CryptoJS.enc.Utf8);

console.log(decrypted); // Voilà! Prints "Hello world!"

切勿在前端使用您的 Laravel APP_KEY。 这是一个很大的软件漏洞。

您应该在设置和获取数据之前创建一个加密和解密数据的特征。

要使用 Laravel Crypt 添加 Encryptable.php

<?PHP
namespace App;

use Illuminate\Support\Facades\Crypt;

trait Encryptable
{
    public function getAttribute($key)
    {
        $value = parent::getAttribute($key);

        if (in_array($key, $this->encryptable)) {
            $value = Crypt::decrypt($value);
        }
        return $value;
    }

    public function setAttribute($key, $value)
    {
        if (in_array($key, $this->encryptable)) {
            $value = Crypt::encrypt($value);
        }

        return parent::setAttribute($key, $value);
    }
}

之后,您可以在模型中使用此特征。 添加 $encryptable 属性。 要加密和解密的列数组。

class User extends Model
{    
    use Encryptable;
    
    protected $encryptable = [
       'column',
       'anotherColumn',
    ];
}

之后像以前一样使用 model。

我在ReactJs用过

加密JS 4.1

let key = process.env.REACT_APP_ENCRYTO_KEY

            let encrypted = atob(response.data)
            encrypted = JSON.parse(encrypted)
            const iv = CryptoJS.enc.Base64.parse(encrypted.iv)
            const value = encrypted.value
            key = CryptoJS.enc.Base64.parse(key)
            let decrypted = CryptoJS.AES.decrypt(value, key, {
                iv
            })
            decrypted = decrypted.toString(CryptoJS.enc.Utf8)
            return {
                ...response,
                data: JSON.parse(decrypted)
            }

Laravel 8.x 使用Encrypter

$encrypter = new Encrypter(Encrypter::generateKey('supported_any_cipher'));
return response($encrypter->encryptString(json_encode($response)), 200);

支持的密码算法及其属性。

['aes-128-cbc' => ['size' => 16, 'aead' => false],
'aes-256-cbc' => ['size' => 32, 'aead' => false],
'aes-128-gcm' => ['size' => 16, 'aead' => true],
'aes-256-gcm' => ['size' => 32, 'aead' => true]]

暂无
暂无

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

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