所选文件数组中的文件使用 CryptoJS 进行 md5 加密始终给出相同的 md5 值
File in selected file array md5 encryption with CryptoJS always gives the same md5 value
在我的 Vuejs 前端中,有一个文件上传按钮。当用户选择文件时,Vuejs 触发 @change event.I 使用了文件 reader 并且我导入了 Cryptojs 库,我已将其下载为节点模块(在 npm 中)。
import cryptoJs from '../../node_modules/crypto-js'
import md5 from '../../node_modules/crypto-js/md5'
我的html文件上传按钮代码如下:
<input type="file" ref="uploadedfile" name="file1" id="file1" @change="handleFileUpload">
@change 函数内的文件 reader 代码:
handleFileUpload(e){
const filesToRead = e.target.files;
//getting the first file from the files array
let file1 = filesToRead[0];
const fileReader = new FileReader();
fileReader.addEventListener('loadend', (evt) => {
if (evt.target.readyState == FileReader.DONE) {
file1 = fileReader.result;
const encryptedvalue = md5(cryptoJs.enc.Latin1.parse(file1)).toString();
console.log("MD5 value is :");
console.log(encryptedvalue);
}
});
}
但我总是得到相同的 md5 值,尽管我选择了不同的文件。
在文件对象数组中,当我通过Chrome开发者工具的控制台检查时,我也可以看到所有文件相关数据。(如果我控制台日志如下)
console.log(file1);
发布的代码缺少加载数据的调用。这可能只是一个 copy/paste 错误。由于使用 Latin1 (aka ISO 8859-1) encoder, FileReader.readAsBinaryString()
解析数据是一种合适的方法,例如:
handleFileUpload(e) {
const filesToRead = e.target.files;
let file1 = filesToRead[0];
const fileReader = new FileReader();
fileReader.addEventListener('loadend', (evt) => {
if (evt.target.readyState == FileReader.DONE) {
file1 = fileReader.result;
const encryptedvalue = md5(cryptoJs.enc.Latin1.parse(file1)).toString();
console.log("MD5 value is :");
console.log(encryptedvalue);
}
});
fileReader.readAsBinaryString(file1); // missing in the posted code
}
但是,我无法用这段代码重现问题,无论是本地还是在线https://codesandbox.io/s/brave-fast-cx9gz(如果在在线情况下显示错误消息 C is undefined,这通常可以通过注释掉和在 components/Repro 中的两个 CryptoJS 导入行中消除 - 不知道为什么会发生这种情况。
但是,当使用 FileReader.readAsArrayBuffer()
加载数据时,我可以重现该问题。如果 ArrayBuffer
然后用 Latin1 编码器解析(如发布的代码),这与此不兼容,那么对于 different 文件总是 same 哈希结果。如果 WordArray
是直接从 ArrayBuffer
创建的,结果再次正确:
const encryptedvalue = md5(cryptoJs.lib.WordArray.create(file1)).toString();
在我的 Vuejs 前端中,有一个文件上传按钮。当用户选择文件时,Vuejs 触发 @change event.I 使用了文件 reader 并且我导入了 Cryptojs 库,我已将其下载为节点模块(在 npm 中)。
import cryptoJs from '../../node_modules/crypto-js'
import md5 from '../../node_modules/crypto-js/md5'
我的html文件上传按钮代码如下:
<input type="file" ref="uploadedfile" name="file1" id="file1" @change="handleFileUpload">
@change 函数内的文件 reader 代码:
handleFileUpload(e){
const filesToRead = e.target.files;
//getting the first file from the files array
let file1 = filesToRead[0];
const fileReader = new FileReader();
fileReader.addEventListener('loadend', (evt) => {
if (evt.target.readyState == FileReader.DONE) {
file1 = fileReader.result;
const encryptedvalue = md5(cryptoJs.enc.Latin1.parse(file1)).toString();
console.log("MD5 value is :");
console.log(encryptedvalue);
}
});
}
但我总是得到相同的 md5 值,尽管我选择了不同的文件。
在文件对象数组中,当我通过Chrome开发者工具的控制台检查时,我也可以看到所有文件相关数据。(如果我控制台日志如下)
console.log(file1);
发布的代码缺少加载数据的调用。这可能只是一个 copy/paste 错误。由于使用 Latin1 (aka ISO 8859-1) encoder, FileReader.readAsBinaryString()
解析数据是一种合适的方法,例如:
handleFileUpload(e) {
const filesToRead = e.target.files;
let file1 = filesToRead[0];
const fileReader = new FileReader();
fileReader.addEventListener('loadend', (evt) => {
if (evt.target.readyState == FileReader.DONE) {
file1 = fileReader.result;
const encryptedvalue = md5(cryptoJs.enc.Latin1.parse(file1)).toString();
console.log("MD5 value is :");
console.log(encryptedvalue);
}
});
fileReader.readAsBinaryString(file1); // missing in the posted code
}
但是,我无法用这段代码重现问题,无论是本地还是在线https://codesandbox.io/s/brave-fast-cx9gz(如果在在线情况下显示错误消息 C is undefined,这通常可以通过注释掉和在 components/Repro 中的两个 CryptoJS 导入行中消除 - 不知道为什么会发生这种情况。
但是,当使用 FileReader.readAsArrayBuffer()
加载数据时,我可以重现该问题。如果 ArrayBuffer
然后用 Latin1 编码器解析(如发布的代码),这与此不兼容,那么对于 different 文件总是 same 哈希结果。如果 WordArray
是直接从 ArrayBuffer
创建的,结果再次正确:
const encryptedvalue = md5(cryptoJs.lib.WordArray.create(file1)).toString();