2013-05-24 51 views
5

Tôi dần dần tính toán MD5 băm của một tệp lớn, trong khi tải lên, tại một thời điểm nào đó, tôi muốn lưu vào HTML5 localStorage những gì tôi đã tính toán cho đến thời điểm này để tiếp tục sau.Tiết kiệm trạng thái CryptoMD5 của CryptoJS dưới dạng chuỗi và khôi phục sau

Từ những gì tôi biết, localStorage có thể lưu chuỗi, vì vậy tôi phải lưu trữ giá trị MD5 tiến bộ dưới dạng chuỗi và sau đó khôi phục chúng, khi người dùng mở trình duyệt sau.

Về cơ bản mã của tôi trông như thế này:

var md5_full = CryptoJS.algo.MD5.create(); 

var wordArray = CryptoJS.lib.WordArray.create(chunk); 

md5_full.update(wordArray); 

Tại thời điểm này, tôi muốn chuyển đổi md5_full thành một chuỗi, để có thể tiết kiệm đến localStorage. Và sau đó, sau đó, khi người dùng muốn tiếp tục tải lên, để có thể truy xuất md5_full từ localStorage, hủy rút gọn và tiếp tục cập nhật nó với các đoạn.

Cuối cùng, tôi có thể gọi md5_full.finalize(); để nhận bản tóm tắt băm MD5 đầy đủ cuối cùng.

+0

Tôi đang cố gắng để sử dụng https://github.com/hunterloftis/cryo (CryoJs) để xâu chuỗi và sau đó phân tích lại. Nhưng phương thức update() chẳng hạn, nó không có trong đối tượng, mà đúng hơn là tôi phải gọi md5_full. $ Super. $ Super.update() ... vì vậy CryptoJS đang sử dụng một số cơ chế thừa kế không được khôi phục đúng cách – StefanH

+0

mã cho stringify và phân tích cú pháp trở lại là: md5_full_str = Cryo.stringify (md5_full); md5_full_restored = Cryo.parse (md5_full_str); Sau đó, md5_full_restored.update() không có sẵn như mô tả ở trên – StefanH

Trả lời

4

Tôi nghĩ rằng vấn đề có thể xảy ra với tuần tự hóa chức năng - CryoJS dường như cố gắng sắp xếp các hàm nhưng nó có thể không khôi phục lại các tham chiếu chính xác (phạm vi bị mất).

Mã bên dưới sẽ giải quyết vấn đề này bằng cách chỉ khôi phục dữ liệu chứ không phải chức năng. JSFiddle.

chức năng

(De) serialization:

/** 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]; 
     } 
    } 
} 

Ví dụ về sử dụng:

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 

(Sử dụng WordArray ném cho tôi một lỗi trong CryptoJS vì một lý do)

+0

Hey, cảm ơn rất nhiều vì giải pháp của bạn! Nó hoạt động! – StefanH

Các vấn đề liên quan