You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.3 KiB
65 lines
1.3 KiB
const crypto = require('crypto')
|
|
const { ERROR } = require('./error')
|
|
|
|
function checkSecret (secret) {
|
|
if (!secret) {
|
|
throw {
|
|
errCode: ERROR.CONFIG_FIELD_REQUIRED,
|
|
errMsgValue: {
|
|
field: 'sensitiveInfoEncryptSecret'
|
|
}
|
|
}
|
|
}
|
|
|
|
if (secret.length !== 32) {
|
|
throw {
|
|
errCode: ERROR.CONFIG_FIELD_INVALID,
|
|
errMsgValue: {
|
|
field: 'sensitiveInfoEncryptSecret'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function encryptData (text = '') {
|
|
if (!text) return text
|
|
|
|
const encryptSecret = this.config.sensitiveInfoEncryptSecret
|
|
|
|
checkSecret(encryptSecret)
|
|
|
|
const iv = encryptSecret.slice(-16)
|
|
|
|
const cipher = crypto.createCipheriv('aes-256-cbc', encryptSecret, iv)
|
|
|
|
const encrypted = Buffer.concat([
|
|
cipher.update(Buffer.from(text, 'utf-8')),
|
|
cipher.final()
|
|
])
|
|
|
|
return encrypted.toString('base64')
|
|
}
|
|
|
|
function decryptData (text = '') {
|
|
if (!text) return text
|
|
|
|
const encryptSecret = this.config.sensitiveInfoEncryptSecret
|
|
|
|
checkSecret(encryptSecret)
|
|
|
|
const iv = encryptSecret.slice(-16)
|
|
|
|
const cipher = crypto.createDecipheriv('aes-256-cbc', encryptSecret, iv)
|
|
|
|
const decrypted = Buffer.concat([
|
|
cipher.update(Buffer.from(text, 'base64')),
|
|
cipher.final()
|
|
])
|
|
|
|
return decrypted.toString('utf-8')
|
|
}
|
|
|
|
module.exports = {
|
|
encryptData,
|
|
decryptData
|
|
}
|