gpt4 book ai didi

authentication - 在 node.js 中生成和验证 session

转载 作者:行者123 更新时间:2023-12-04 04:28:04 25 4
gpt4 key购买 nike

生成 session 并在每个请求上验证它的正确方法是什么?

注册和初始认证(生成 session 的用户身份检查)是由外部服务处理的,所以这是不可能的。

为了简化问题,使用 secret 生成和加密 session 的 native 安全方式是什么。

要求(欢迎替代) :

  • session 应该由两部分组成,一是存储在 cookie 中,二是存储在数据库中。
  • 服务器使用数据库 session 部分、cookie 部分和验证功能处理用户检查。
  • session 生成和验证功能存储在服务器端,用户无法访问。
  • 如果数据库 session 部分或功能受到损害,黑客就无法冒充用户提出请求。为此,他将需要窃取用户 cookie 或 session 生成函数和数据库 session 部分。
  • 具有相同数据库 session 部分的多设备支持。
  • JWT 不可用,因为服务器端需要注销(数据库 session 部分将被删除,所有设备将无法使用旧的 cookie session 部分登录)。用户有一些可以更改的信任级别,这将需要 JWT 失效,因此 session 是更好的选择。

  • 我想为此使用加密 AES,但在 asking "is it ok? 之后“- 答案是否定的,我不是加密专家,所以我没有完全理解原因。

    这是我最初的实现想法:
    /**
    * @param {string} data dummy
    * @param {string} userKey from database or create new
    * @return {object} {iv, key, encryptedData}
    */
    function encrypt(data, userKey) {
    let key = userKey ? Buffer.from(userKey, 'hex') : crypto.randomBytes(32)
    let iv = crypto.randomBytes(16)
    let cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(key), iv)
    let encrypted = cipher.update(data)
    encrypted = Buffer.concat([encrypted, cipher.final()])
    return { iv: iv.toString('hex'), key: key.toString('hex'), encryptedData: encrypted.toString('hex') }
    }

    /**
    * @param {string} iv
    * @param {string} key
    * @param {string} encryptedData
    * @return {string} decrupted dummy data
    */
    function decrypt(iv, key, encryptedData) {
    try {
    iv = Buffer.from(iv, 'hex')
    key = Buffer.from(key, 'hex')
    encryptedData = Buffer.from(encryptedData, 'hex')
    let decipher = crypto.createDecipheriv('aes-256-cbc', key, iv)
    let decrypted = decipher.update(encryptedData)
    decrypted = Buffer.concat([decrypted, decipher.final()])
    return decrypted.toString()
    } catch (err) {
    return false
    }
    }

    最佳答案

    一种方法是,用户生成 RSA 并使用 crypto使用公钥和私钥,但公钥必须始终由用户('设备')发送

        'use strict';
    const express = require('express');
    const fs = require('fs');
    const nodersa = require('node-rsa');
    const bodyParser = require('body-parser');

    let app = express();
    app.use(bodyParser.urlencoded({ extended : false }));
    app.use(bodyParser.json());
    // req.body.value is public key, this never write in database or file
    app.post('/', (req, res)=>{
    let value = req.body.value;
    const privateKey = fs.readFileSync('./store/privateKey.pem', 'utf8');
    const original = new nodersa(privateKey).decrypt(value, 'utf8');
    res.end(original);
    });

    app.listen(8000, ()=>{
    console.log('on 8000');
    });

    如果您使用 public certificate authority对于节点,使用名为“认证文件”的附加文件,节点示例 here ,这个文件是由 C.A.你可以当 C.A.并生成此文件,但建议用于封闭系统,如果您不需要州长允许

    关于authentication - 在 node.js 中生成和验证 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60186757/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com