在node.js中生成和验证会话

问题描述 投票:2回答:1

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

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

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


要求(欢迎使用替代项)

  • 会话应分为两部分,一部分存储在cookie中,另一部分存储在数据库中。
  • 服务器使用数据库会话部分,cookie部分和验证功能来处理用户检查。
  • 会话生成和验证功能存储在服务器端,用户无法访问。
  • 如果数据库会话的部分或功能遭到破坏,黑客将无法假装成为用户。为此,他将需要窃取用户cookie或会话生成功能以及数据库会话部分。
  • 具有相同数据库会话部分的多设备支持。
  • JWT不可用,因为需要在服务器端注销(数据库会话部分将被删除,并且所有设备将无法使用旧的Cookie会话部分登录)。用户具有一些可以更改的信任级别,这将需要JWT无效,因此会话是更好的选择。

我曾考虑为此使用加密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
  }
}
authentication session encryption cryptography cryptojs
1个回答
0
投票

一种实现方法,是用户生成RSA并使用crypto和公共和私有密钥,但是公共密钥必须始终由用户(“设备”)发送

© www.soinside.com 2019 - 2024. All rights reserved.