生成会话并根据每个请求进行验证的正确方法是什么?
注册和初始身份验证(用于生成会话的用户身份检查)是由外部服务处理的,因此这是不可能的。
为了简化一个问题,用秘密生成和加密会话的本机安全方法是什么。
要求(欢迎使用替代项):
我曾考虑为此使用加密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和公共和私有密钥,但是公共密钥必须始终由用户(“设备”)发送