Javascript 保存CryptoJS';将CryptoMD5状态设置为字符串,并在以后还原
在上传过程中,我逐渐计算一个大文件的MD5散列,然后在某个时候我想将我迄今为止计算的内容保存到HTML5Javascript 保存CryptoJS';将CryptoMD5状态设置为字符串,并在以后还原,javascript,cryptojs,Javascript,Cryptojs,在上传过程中,我逐渐计算一个大文件的MD5散列,然后在某个时候我想将我迄今为止计算的内容保存到HTML5localStorage,以便以后能够继续 据我所知,localStorage可以存储字符串,因此我必须将渐进式MD5值存储为字符串,然后在用户稍后打开浏览器时还原它们 基本上,我的代码如下所示: var md5_full = CryptoJS.algo.MD5.create(); var wordArray = CryptoJS.lib.WordArray.create(chunk);
localStorage
,以便以后能够继续
据我所知,localStorage
可以存储字符串,因此我必须将渐进式MD5值存储为字符串,然后在用户稍后打开浏览器时还原它们
基本上,我的代码如下所示:
var md5_full = CryptoJS.algo.MD5.create();
var wordArray = CryptoJS.lib.WordArray.create(chunk);
md5_full.update(wordArray);
此时,我想将md5\u full
转换为字符串,以便能够保存到localStorage
。然后,在稍后,当用户希望恢复上载时,为了能够从localStorage
检索md5_full
,取消字符串化,并继续使用块更新它
最后,我应该能够调用
md5_full.finalize()获取最终完整的MD5哈希摘要。我认为问题可能在于函数序列化-CryoJS显然试图序列化函数,但可能无法正确还原引用(范围丢失)
下面的代码通过仅恢复数据而不是函数来避免此问题
(反)序列化函数:
/** Serialize MD5 object. */
function stringify_md5(md5) {
return JSON.stringify(md5);
}
/** Deserialize MD5 object. */
function parse_md5(serialized_md5) {
var md5 = CryptoJS.algo.MD5.create();
restore_data(JSON.parse(serialized_md5), md5);
return md5;
}
/** Recursively copy properties from object source to object target. */
function restore_data(source, target) {
for (var prop in source) {
var value = source[prop];
if (typeof value == "object") {
if (typeof target[prop] != "object") {
target[prop] = {};
}
restore_data(source[prop], target[prop]);
} else {
target[prop] = source[prop];
}
}
}
用法示例:
var chunk1 = "abc", chunk2 = "def";
// The correct hash:
var md5_full_1 = CryptoJS.algo.MD5.create();
md5_full_1.update(chunk1);
md5_full_1.update(chunk2);
var correct_hash = md5_full_1.finalize();
// Using stringify/parse
var md5_full_2 = CryptoJS.algo.MD5.create();
md5_full_2.update(chunk1);
var md5_serialized = stringify_md5(md5_full_2); // serialize
md5_full_2 = parse_md5(md5_serialized); // deserialize
md5_full_2.update(chunk2);
var result_hash = md5_full_2.finalize();
alert(correct_hash.toString() == result_hash.toString()); // true
(由于某种原因,使用WordArray在CryptoJS中给我带来了一个错误)我正在尝试使用(CryoJs)进行字符串化,然后重新解析。但是update()方法例如,它不在对象中,而是我必须调用md5_full.$super.$super.update()。。。因此CryptoJS使用了一些未正确恢复的继承机制。用于stringify和解析的代码是:md5_full_str=Cryo.stringify(md5_full);md5_full_restored=Cryo.parse(md5_full_str);然后,如上所述,md5_full_restored.update()不可用