首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Node.js加密文本文件中的单个行

使用Node.js加密文本文件中的单个行
EN

Stack Overflow用户
提问于 2019-04-22 12:11:36
回答 2查看 122关注 0票数 1

我尝试加密文本文件中的每一行,而不是文本文件本身。这是我用来加密单行文本的代码。

代码语言:javascript
复制
crypto.pbkdf2(password, salt, iteration, keylen, digest, (error, derivedKey) => {
    const iv = Buffer.from('myiv', 'hex');

    const cipher = crypto.createCipheriv(algorithm, derivedKey, iv);

    let encryptThis = `Encrypt me`;
    let encrypted = '';

    cipher.on('readable', () => {
        let chunk;
        while (null !== (chunk = cipher.read())) {
            encrypted += chunk.toString('base64');
        }
    });

    cipher.on('end', () => {
        console.log(`Example string:   ${encryptThis}`);
    });

    cipher.write(encryptThis);
    cipher.end();
});

我知道我也可以使用cipher.update(text)cipher.final()进行加密,我也尝试过这种方法,但没有成功。问题是如何逐行读取文件并对每一行进行加密。我尝试过这两种方法,但总是导致只有一行被加密或出现错误。我希望能够通过流转换来实现这一点,比如。

代码语言:javascript
复制
readStream
    .pipe(encryptLine)
    .pipe(writeStream)
    .on('finish', err => {
        if (err) console.log(err);
    });
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-23 08:23:53

我将首先实现一个转换流(或利用现有的库)逐行读取文件。

代码语言:javascript
复制
function toLines() {
    let line = '';
    return new Transform({
        decodeStrings: false,
        readableObjectMode: true,
        transform(chunk, encoding, callback) {
            const lines = chunk.split(/\r?\n/g);

            line += lines.shift();
            while (lines.length) {
                this.push(line);
                line = lines.shift();
            }

            callback();
        },
        flush(callback) {
            if (line) {
                this.push(line);
            }
            callback();
        }
    });
}

然后,我将实现一个转换流来加密每一行。

代码语言:javascript
复制
function encryptLines(algorithm, derivedKey, iv) {
    return new Transform({
        readableObjectMode: false,
        writableObjectMode: true,
        transform(line, encoding, callback) {
            const cipher = crypto.createCipheriv(algorithm, derivedKey, iv);
            this.push(cipher.update(line, encoding, 'base64'));
            this.push(cipher.final('base64'));
            this.push('\n');
            callback();
        }
    });
}

然后,您可以(根据需要)将所有内容简单地pipe到输出流中。

代码语言:javascript
复制
fs.createReadStream('input.txt', {encoding: 'utf8'})
    .pipe(toLines())
    .pipe(encryptLines(algorithm, derivedKey, iv))
    .pipe(fs.createWriteStream('output.txt'))
    .on('finish', () => console.log('done'));
票数 1
EN

Stack Overflow用户

发布于 2019-04-23 05:18:17

想出了一个解决方案。我将所有的加密逻辑都移到了一个函数中,包括create和end,我对文件中的每一行都这样做。我的问题是试图重复使用密码。

代码语言:javascript
复制
const encrypt = (line, thisTransform) => {
    crypto.pbkdf2(password, salt, iteration, keylen, digest, (error, derivedKey) => {
        const cipher = crypto.createCipheriv(algorithm, derivedKey, iv);

        let encrypted = '';
        cipher.on('readable', () => {
            while (null !== (chunk = cipher.read())) {
                encrypted += chunk.toString('base64');
            }
        });

        cipher.on('end', () => {
            thisTransform.push(`${encrypted}\n`);
        });
        cipher.write(line);
        cipher.end();
    });
};

let encryptLine = new stream.Transform();
encryptLine._transform = function(chunk, encoding, callback) {
    let rows = chunk
        .toString()
        .split('\n')
        .map(line => line.replace(/[\n\r]/g, ''))
        .forEach(line => {
            encrypt(line, this);
        });
};

readStream
    .pipe(encryptLine)
    .pipe(writeStream)
    .on('finish', err => {
        if (err) console.log(err);
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55789017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档