Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Authentication 在node.js中生成并验证会话_Authentication_Session_Encryption_Cryptography_Cryptojs - Fatal编程技术网

Authentication 在node.js中生成并验证会话

Authentication 在node.js中生成并验证会话,authentication,session,encryption,cryptography,cryptojs,Authentication,Session,Encryption,Cryptography,Cryptojs,生成会话并对每个请求进行验证的正确方法是什么 注册和初始身份验证(生成会话的用户身份检查)由外部服务处理,所以这是不可能的 为了简化一个问题,生成和加密带有secret的会话的本机安全方法是什么 要求(欢迎选择): 会话应该由两部分组成,一部分存储在cookies中,另一部分存储在数据库中 服务器使用数据库会话部分、cookies部分和验证功能处理用户检查 会话生成和验证存储在服务器端且用户无法访问的功能 若数据库会话部分或功能被破坏,黑客就不能冒充用户发出请求。为此,他需要窃取用户cook

生成会话并对每个请求进行验证的正确方法是什么

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

为了简化一个问题,生成和加密带有secret的会话的本机安全方法是什么


要求(欢迎选择)

  • 会话应该由两部分组成,一部分存储在cookies中,另一部分存储在数据库中
  • 服务器使用数据库会话部分、cookies部分和验证功能处理用户检查
  • 会话生成和验证存储在服务器端且用户无法访问的功能
  • 若数据库会话部分或功能被破坏,黑客就不能冒充用户发出请求。为此,他需要窃取用户cookie或会话生成函数和数据库会话部分
  • 使用同一数据库会话部分支持多个设备
  • JWT不可用,因为服务器端需要注销(数据库会话部分将被删除,所有设备将无法使用旧的Cookie会话部分登录)。用户有一些可以更改的信任级别,它需要JWT失效,所以会话是更好的选择
我本来想用加密AES来做这件事,但事后回答是否定的,我不是加密方面的专家,所以我没有完全理解其中的原因

以下是我对实施的初步想法:

/**
 * @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并使用公钥和私钥,但公钥必须始终由用户(“设备”)发送


如果使用with节点,请使用名为“认证文件”的传统文件“,节点示例,此文件由C.A.发布。您可以作为C.A.和generarte使用此文件,但建议用于封闭系统,如果您不需要Gubermental allow

我不确定我是否理解,但您似乎希望所有设备都有一个单独的会话。通常每个设备的每个浏览器都有一个会话。@Aleuck我为用户提供了一个私钥,并为设备生成了不同的会话。用户将私钥存储在哪里?在您的服务器上,但他应该使用除您或您的服务之外的其他工具生成私钥,它应该有Expirations另外你可以使用授权实体,这样它会保留私钥,只有这个实体会说如果它的公钥有效。对不起,我修改了我的答案,希望能帮助你什么是公钥?如何生成它?它对于不同的用户是唯一的?我是否可以在用户注销时使此密钥无效,以便所有设备也将注销?如何在本地主机上使用它?
    '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');
});