NodeJS Crypto.createDecipheriv -错误:不支持的状态或无法验证decipher.final()

8xiog9wr  于 2023-05-06  发布在  Node.js
关注(0)|答案(1)|浏览(270)

我收到这个错误消息:Error: Unsupported state or unable to authenticate data当试图解密后端发送的前端信息时。
这是我的后台代码:

const userInfo = await this.permsRepository.find({
            where: {
                email: email,
            },
        });
        
        // Generate initialization vector
        const iv = randomBytes(16);
        // Get secret key
        const key = process.env.USERSECRET;
        // Encryption settings
        const cipher = createCipheriv('aes-256-gcm', Buffer.from(key), iv);

        // Encrypt
        const stringUserInfo = JSON.stringify(userInfo);
        let encryptedUserInfo = cipher.update(stringUserInfo, 'utf-8', 'hex');
        encryptedUserInfo += cipher.final('hex');

        const tag = cipher.getAuthTag().toString('hex');

        return {
            iv: iv.toString('hex'), 
            data: encryptedUserInfo,
            tag: tag
        }

这是我在前端尝试解密的方式:

const iv = Buffer.from(`${encryptJson.iv}`, 'hex');
        const encryptedInfo = Buffer.from(`${encryptJson.data}`, 'hex');
        // Get secret key
        const key = process.env.USERSECRET;
        // Configure decipher
        const decipher = crypto.createDecipheriv('aes-256-gcm', Buffer.from(key), Buffer.from(iv));
        decipher.setAuthTag(Buffer.from(`${encryptJson.tag}`, 'hex'));

        try {
            let decrypted = decipher.update(encryptedInfo, 'hex', 'utf-8');
            decrypted += decipher.final('utf-8');

            console.log(decrypted.toString());

我一直在寻找类似的问题,但似乎他们的所有问题都通过在他们的密码和解密中添加authTags来解决,我已经在我的加密和解密函数中使用了这一点。
我仍然得到那个错误,特别是在decipher.final()被附加到decrypted对象的那一行。

uqzxnwby

uqzxnwby1#

我无法直接使用crypto库解决这个问题,所以我开始研究可能的替代方案。
我最终在前端和后端都使用了crypto-js的AES。使用它包含的方法加密和解密解决了我遇到的问题。
我不确定是什么原因导致了环境差异。

相关问题