如何在Node.js中加密和解密字符串/对象

5

我想加密一个对象然后再解密它。加密很好用,但是解密失败了。以下是我的代码:

crypto_ext.js

const crypto = require("crypto")
const password = "shared_key"
const algorithm = "aes256"

export const encrypt = (text) => {
    if(!text) return ''
    const cipher = crypto.createCipher(algorithm, password);
    let crypted = cipher.update(text, 'utf-8', 'base64');
    crypted += cipher.final('base64');
    return crypted;
}

export const decrypt = (text) => {
    if(!text) return ''
    const decipher = crypto.createDecipher(algorithm, password);
    let decrypted = decipher.update(text, 'base64', 'utf-8');
    decrypted += decipher.final('utf-8');
    return decrypted;
}

在我的 test.js 文件中,我有以下内容:
import {encrypt, decrypt} from './crypto_ext.js'
let test = {key1: val1, key2: val2}
test = encrypt(JSON.stringify(test)) || test
console.log("Encrypt : ", test)
console.log("Decrypt : ", decrypt(test)) // I should have my object as string here

这是我收到的错误信息:

And this is what I'm getting as error :

Uncaught Error: unable to decrypt data
at unpad (decrypter.js:83)
at Decipher.webpackJsonp../node_modules/browserify-aes/decrypter.js.Decipher._final (decrypter.js:38)
at Decipher.webpackJsonp../node_modules/cipher-base/index.js.CipherBase._finalOrDigest (index.js:76)
at decrypt (crypto_ext.js:17)
...

你能告诉我我做错了什么吗?


为什么在 test = encrypt(JSON.stringify(test)) || test 中添加了 || test - Ebbe M. Pedersen
我测试了你的代码,它可以正常运行。 - Ko Ohhashi
3个回答

2

依赖项: crypto

您可以使用以下代码实现编码和解码:

   const crypto = require('crypto');
        var password = 'ojisdasjdsjabdjs';
        var iv = 'kiamdksndn';

        function sha1(input) {
            return crypto.createHash('sha1').update(input).digest();
        }

        function password_derive_bytes(password, salt, iterations, len) {
            var key = Buffer.from(password + salt);
            for (var i = 0; i < iterations; i++) {
                key = sha1(key);
            }
            if (key.length < len) {
                var hx = password_derive_bytes(password, salt, iterations - 1, 20);
                for (var counter = 1; key.length < len; ++counter) {
                    key = Buffer.concat([key, sha1(Buffer.concat([Buffer.from(counter.toString()), hx]))]);
                }
            }
            return Buffer.alloc(len, key);
        }


        async function encode(string) {
            var key = password_derive_bytes(password, '', 100, 32);
            var cipher = crypto.createCipheriv('aes-256-cbc', key, Buffer.from(iv));
            var part1 = cipher.update(string, 'utf8');
            var part2 = cipher.final();
            const encrypted = Buffer.concat([part1, part2]).toString('base64');
            return encrypted;
        }

        async function decode(string) {
            var key = password_derive_bytes(password, '', 100, 32);
            var decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv));
            var decrypted = decipher.update(string, 'base64', 'utf8');
            decrypted += decipher.final();
            return decrypted;
        }

然后调用以下函数进行编码和解码

进行编码

await encode(JSON.stringify({'title': 'some text'}));

解码

await decode('encoded_string_to_decode');

1
JFYI,收到了这个错误:无效的初始化向量。 - Nishant Kumar Verma

1

-1

尝试使用“bcrypt”包,它可以帮助您加密密码。 如果您想要对数据进行加密。那么请使用crypto或node-rsa

链接 npm bcrypt package

Node-RSA


4
bcrypt是一种密码哈希函数和密钥派生函数(KDF),与加密/解密无关。 - Luke Joshua Park
嗨,Shraddha。感谢您的反馈,但是这个模块更适用于密码加密。我想要做的是首先加密我的字符串,然后将其作为参数传递到URL中,根据此参数我可以解密它并在其他页面中显示其内容。 - Maria Minh
你好,现在我明白你实际上在这里寻找什么了。我简要阅读了你的描述,因此得出了错误的答案。你可以尝试使用 'https://www.npmjs.com/package/node-rsa' 这个 Node RSA 包来加密和解密数据。 - Shraddha Goel
1
@MariaMinh,你能告诉我你正在使用哪个包吗?因为现在已经弃用了Crypto。Crypto.js是一个新的包。 - Shraddha Goel
@ShraddhaGoel 我使用了Crypto.js,但在解密时遇到了另一个错误。我得到了“Error: Malformed UTF-8 data”... - Maria Minh
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接