我想以字符串格式存储加密数据。不幸的是,我无法做到这一点,我不明白为什么。
由于某种原因,这一行:
const str = new TextEncoder().encode(buff1);
创建一个字符串,其字节数和字节数与之前的Arraybuffer中的字节数不同。
此代码的最终结果是这些记录到控制台:
ArrayBuffer {byteLength:139}
ArrayBuffer {byteLength:262}
这是一个问题,因为它们应该是相似的,但事实并非如此。我尝试了很多替代方案,但所有可行的方法都可以解决同样的问题。如果有人能告诉我如何解决这个问题,我将非常感激。
请注意,EncryptText函数的工作方式应该如此。我只为那些想要将代码运行到IDE中的人添加了它。
async function encryptText(plainText, iv, password): Promise<ArrayBuffer> {
const ptUtf8 = new TextEncoder().encode(plainText);
const pwUtf8 = new TextEncoder().encode(password);
const pwHash = await crypto.subtle.digest('SHA-256', pwUtf8);
const alg = { name: 'AES-GCM', iv: iv };
const key = await crypto.subtle.importKey('raw', pwHash, alg, false, ['encrypt']);
return crypto.subtle.encrypt(alg, key, ptUtf8);
};
async function encrBuffToUtf8Test() {
const plainData = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, ' +
'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.';
const password = 'infamous';
const randomValues = crypto.getRandomValues(new Uint8Array(12));
const encryptionResult1 = await this.encryptText(plainData, randomValues, password);
const buff1 = Buffer.from(encryptionResult1);
const str = new TextEncoder().encode(buff1);
const utf8buff = new TextDecoder('utf-8').decode(buff);
const encryptionResult2 = utf8buff.buffer;
const resTest = encryptionResult1 === encryptionResult2;
if (!resTest) {
console.log(encryptionResult1);
console.log(encryptionResult2);
}
}
答案 0 :(得分:4)
我想我几乎每天都会写这个答案,但是you can't convert arbitrary binary data to a string再次使用标准字符编码。它根本不起作用。
请考虑使用base64或hex。