1. 程式人生 > >單向散列加密

單向散列加密

sta 特點 ads clas eat 網頁 reads 字符串 pip

  開發中有一種場景,就是只需要驗證正確性而不需要知道它的原文,只需要知道這個值是否存在是否相等就可以了。比如前端登錄將用戶的密碼加密給服務端並存儲到數據庫。或者驗證文件唯一性等。這時就要用到單向散列加密。

  單向散列函數特點

  1. 對任意長度的消息散列值是定長的。

  2. 散列計算速度快,非常高效。

  3. 明文不同,散列加密後的密文一定不同;明文相同,散列加密後密文一定相同。

  4. 具備單向性,無法逆推計算。

  

  單向散列函數也被稱為哈希函數,摘要函數或者雜湊函數。其經典算法有 md5 | sha | sha1 | sha256 | sha512 | RSA-SHA等。

【crypto.js驗證文件唯一性】

  從百度一張圖片,遠程下載一張圖片到本地並放入工程,命名為123.jpg,這個文件作為本地圖片。同時從網頁上復制遠程這張圖片的地址。最終通過散列後的字符串驗證本地圖片與遠程url圖片是否為同一張。代碼如下:

let crypto = require(‘crypto‘);
let fs = require(‘fs‘);
let request = require(‘request‘);

// 散列算法 ‘md5‘,‘sha‘,‘sha1‘,‘sha256‘,‘sha512‘,‘RSA-SHA‘,‘RSA-SHA1‘,‘RSA-SHA256‘,‘RSA-SHA512‘
let algorithm = ‘sha256‘; // 讀取遠程圖片流 function dealRemoteUrl(callBack) { let imgUrl = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1513790489449&di=6200ee667da844c128e5ef5516a9195d&imgtype=0&src=http%3A%2F%2Fstatic.oschina.net%2Fuploads%2Fimg%2F201312%2F23183439_zFLQ.png" let outStream
= fs.createWriteStream(‘./other/output.jpg‘); request(imgUrl).pipe(outStream); // 將圖片流輸出 let remoteData = ‘‘; request(imgUrl).on(‘data‘, (chunk) => { remoteData += chunk; }); request(imgUrl).on(‘end‘, (chunk) => { let hashDealObj = crypto.createHash(algorithm); let remoteHashStr = hashDealObj.update(remoteData).digest(‘hex‘); callBack(remoteHashStr); }); } // 讀取本地圖片流 function dealLocalImg(callBack) { let readerStream = fs.createReadStream(‘./other/123.jpg‘); let readData = ‘‘; readerStream.on(‘data‘, (chunk) => { readData += chunk; }); readerStream.on(‘end‘, (chunk) => { let hashDealObj = crypto.createHash(algorithm); let hashStr = hashDealObj.update(readData).digest(‘hex‘); callBack(hashStr); }) } // 對比圖片操作 dealRemoteUrl( (remoteHashStr) => { console.log(‘rHash=‘, remoteHashStr); dealLocalImg( (localHashStr) => { console.log(‘lHash=‘, localHashStr); if (localHashStr == remoteHashStr) { console.log("圖片一致"); } else { console.log("圖片不一致"); } }); });

  執行結果如下

  技術分享圖片  

  

單向散列加密