Nodejs cookie读取解码问题

Nodejs cookie读取解码问题

cnodeclub 系统中。 采用 exports.decrypt = function(str,secret) { var decipher = crypto.createDecipher(‘aes192’, secret); console.log(decipher); var dec = decipher.update(str,‘hex’,‘utf8’); console.log(dec); dec += decipher.final(‘utf8’); console.log(dec); return dec; } 这个方法做对cookie的解码并返回 可是在 var decipher = crypto.createDecipher(‘aes192’, secret); 后 decipher 的值为{} 说明解码失败。。 求解

3 回复

Node.js Cookie 读取与解码问题

问题描述

在使用 CNodeClub 系统时,尝试通过自定义的 decrypt 方法对存储在 Cookie 中的数据进行解码。但发现解码过程失败了,具体表现在 crypto.createDecipher('aes192', secret) 创建的 decipher 对象为空(即 {}),导致后续解码操作无法正常进行。

解决方案

首先需要确保你使用的加密算法与解密算法相匹配。在你的代码中,你尝试使用的是 AES-192 加密算法 ('aes192'),但在实际应用中,更常见的可能是 AES-128 或 AES-256。此外,还需要注意字符串编码格式的一致性。

下面是一个修正后的解码示例:

const crypto = require('crypto');

exports.decrypt = function(str, secret) {
    // 使用 AES-256-CBC 加密模式
    const decipher = crypto.createDecipheriv('aes-256-cbc', secret, Buffer.alloc(16, 0)); // 16 字节的初始向量 IV
    
    let decrypted = decipher.update(str, 'base64', 'utf8');
    decrypted += decipher.final('utf8');
    
    return decrypted;
}

// 示例用法
const encryptedCookieValue = 'your_encrypted_cookie_value_here';
const secretKey = 'your_32_byte_secret_key_here'; // 需要 32 字节长度的密钥

try {
    const decryptedValue = decrypt(encryptedCookieValue, secretKey);
    console.log('Decrypted value:', decryptedValue);
} catch (error) {
    console.error('Error during decryption:', error.message);
}

关键点解释

  1. 加密模式:从 createDecipher 改为 createDecipheriv,后者支持指定初始化向量(IV),这在 AES 加密中通常是必需的。
  2. 密钥长度:AES-256 需要 32 字节长度的密钥。
  3. 编码格式:从 'hex' 改为 'base64',因为通常加密后的数据更适合用 base64 编码来表示。

通过这些调整,可以提高解码的成功率,并解决你遇到的问题。


问题解决了,不是主个方法问题 是我数据写入的问题

在Node.js中使用crypto模块进行AES加密解密时,如果遇到decipher对象为空(即{})的情况,通常是因为某些参数不正确或者字符串格式不对。针对你的问题,这里提供一个完整的示例,展示如何正确地读取和解码加密后的Cookie。

示例代码

首先,你需要安装必要的包,比如cookie-parser用于解析Cookie:

npm install cookie-parser

然后,你可以使用以下代码来实现Cookie的读取与解码:

const express = require('express');
const cookieParser = require('cookie-parser');
const crypto = require('crypto');

const app = express();

// 设置一个用于加密/解密的密钥
const secretKey = 'your_secret_key_here';

app.use(cookieParser(secretKey));

app.get('/', (req, res) => {
    // 假设我们有一个名为`encrypted-cookie`的加密Cookie
    const encryptedCookieValue = req.cookies['encrypted-cookie'];

    if (!encryptedCookieValue) {
        return res.send("No encrypted cookie found.");
    }

    // 使用crypto模块解密
    const decipher = crypto.createDecipher('aes-192-cbc', secretKey);
    let decryptedCookie = decipher.update(encryptedCookieValue, 'base64', 'utf8');
    decryptedCookie += decipher.final('utf8');

    console.log(`Decrypted Cookie: ${decryptedCookie}`);

    res.send(`Decrypted Cookie Value: ${decryptedCookie}`);
});

app.listen(3000, () => {
    console.log('Server running on port 3000');
});

关键点解释

  1. 使用正确的算法名称

    • 在你的例子中,你尝试使用'aes192'作为加密算法,但在Node.js的crypto模块中,你应该指定具体的模式,如'aes-192-cbc''aes-256-cbc'
  2. 解密数据格式

    • encryptedCookieValue通常会以Base64编码形式存储。因此,在解密之前需要将Base64字符串转换为二进制数据。
  3. 使用cookie-parser中间件

    • 这个中间件可以自动解析请求中的Cookie,并将其存储在req.cookies对象中,方便后续处理。

通过上述调整,你应该能够成功解码加密的Cookie值。确保使用的密钥与加密时使用的一致,否则解密将无法完成。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!