前端加密控件CryptoJS的使⽤
在做Web项⽬的过程中,由于要通过页⾯上传多个⽂件,⽽我们在后台计算过程中仅需要⽂件的哈希值,为了节省带宽,我们选择在前端页⾯进⾏⽂件哈希值计算,然后把哈希值传递给后台,这样避免了传递⼤量⽂件。
CryptoJS为JavaScript库,提供了各种各样的加密算法,包括MD5、SHA1、SHA256、AES、Rabbit等
(⼀)CryptoJS Github地址:
(⼆)使⽤⽅法
1)引⼊核⼼js⽂件,需要使⽤的算法对应的js⽂件
2)cryptojs⽀持对字符串计算,或者对WordArray类型(CryptoJS⾃⼰封装的数据类型)值的计算,如果需要对⽂件进⾏哈希值计算,则使⽤WordArray⽅式。
⽰例:
//String
var sha1Encrypt = CryptoJS.SHA1("Message");
var sha256Encrypt = CryptoJS.SHA256("Message");
//WordArray
var wordArray = Utf8.parse("cfca1234");
var base64 =  Base64.stringify(wordArray);
3)对⽂件计算⽰例
//对⽂件计算哈希值:
function arrayBufferToWordArray(ab) {
var i8a = new Uint8Array(ab);
var a = [];
for (var i = 0; i < i8a.length; i += 4) {
a.push(i8a[i] << 24 | i8a[i + 1] << 16 | i8a[i + 2] << 8 | i8a[i + 3]);
}
return CryptoJS.ate(a, i8a.length);
}
function uploadFile(){
var dat = $("#testfile")[0].files[0];
var reader = new FileReader();
console.log(sult);
var fileString = sult;
var wordArray = arrayBufferToWordArray(fileString);
var hash = CryptoJS.SHA256(wordArray).Hex);
$("#file256").text(hash);
}
}
4)CryptoJS update
但是上⾯的⽅式会把⽂件⼀次性读⼊内存,⾮常耗浏览器内存,当⽂件⽐较⼤时,容易导致浏览器崩溃,因此采⽤了CryptoJS update的⽅式,增量计算哈希值
function loadFile(fileId,hashId){
var contractFile = $("#"+fileId)[0].files[0];
var reader = new FileReader();
var blobSlice = Slice || File.prototype.webkitSlice || File.prototype.slice;
// 指定⽂件分块⼤⼩(2M)
var chunkSize = 6 * 1024 * 1024;
// 计算⽂件分块总数
var chunks = il(contractFile.size / chunkSize);
// 指定当前块指针
var currentChunk = 0;
var hasher = CryptoJS.ate();
// FileReader分⽚式读取⽂件
// 计算开始读取的位置
var start = currentChunk * chunkSize;
// 计算结束读取的位置
var end = start + chunkSize >= contractFile.size ? contractFile.size : start + chunkSize;
var fileStr = sult;
var tmpWordArray = arrayBufferToWordArray(fileStr);
hasher.update(tmpWordArray);
currentChunk += 1;
fileStr = null;
tmpWordArray = null;
// 判断⽂件是否都已经读取完
if (currentChunk < chunks) {
/
/ 计算开始读取的位置
var start = currentChunk * chunkSize;
// 计算结束读取的位置
var end = start + chunkSize >= contractFile.size ? contractFile.size : start + chunkSize;            adAsArrayBuffer(blobSlice.call(contractFile, start, end));
}
}
contractFile = null;
var fileobj = ElementById(fileId);
if(fileobj.outerHTML){
fileobj.outerHTML = fileobj.outerHTML;
}
CollectGarbage();
var hash = hasher.finalize();
$("#"+hashId).val(hash);
hasher = null;
blobSlice = null;
reader = null;
hash = null;
CollectGarbage();
}
}
(三)总结
parse和stringify
var wordArray = Utf8.parse(utf8String);
var wordArray = Latin1.parse(latin1String);
var wordArray = Hex.parse(hexString);
var wordArray = Base64.parse(base64String);
var utf8String = Utf8.stringify(wordArray);
var latin1String = Latin1.stringify(wordArray);
var hexString = Hex.stringify(wordArray);
var base64String = Base64.stringify(wordArray);js代码加密软件
消息摘要算法
var hash = CryptoJS.MD5(message);
var hash = CryptoJS.MD5(wordArray);
......
update调⽤⽅式
var hasher = CryptoJS.ate();
hasher.update('message');
hasher.update(wordArray);
var hash = hasher.finalize();
var hash = hasher.finalize('message');
var hash = hasher.finalize(wordArray);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。