初識加密算法

本文中使用到的代碼可至github.com/FantasyGao/…獲取。1.加密算法的意義

很簡單,加密算法的出現正是爲了解決萬物互聯下數據隱私與安全的問題,在暢遊於網絡之中時候,那即是數據在不停的交換和流動的時候,若是沒有加密算法,咱們的 各類密碼,或者一些私密信息便在網絡中「裸奔」,只要有攻擊者去攔截你在交換數據時發出的請求操做,那便意味着你毫無私密可言。javascript

2.加密算法的使用的場景

從我如今接觸的技術來看,使用加密的場景其實並非不少,由於互聯網原本就是萬物互聯,信息共享爲基礎的,如不少的網站,出發點就是讓人去閱讀去了解它,可是你在 網站上作一些想要讓其餘人知道這個是你作的記錄的時候,你便須要像現實生活中同樣,建立一個網站身份證,這個操做就是你註冊帳號的過程,這時候會一個密碼來讓這個 帳號只能讓你登陸,因此這個密碼不能讓其餘人知道的,因此當你填寫完密碼提交的時候會發送一個加密後的串,提交給網站後臺入庫,爲了安全不被脫庫,網站只會存這個 串,因此這個密碼通常是除了你連網站人員也不知道的,這就是你忘了密碼後,只能改,不能找回的緣由。這種加密方式是不可解密的。仍是註冊這個過程,不少時候咱們都 是填手機號註冊的,可是把用戶存入數據庫也是很不安全的,因此這時候還須要將手機號碼加密後存進去,可是存入手機號後,網站通常須要給你發驗證碼什麼的,這確定不 能像加密密碼那種不能解密的方式,這個時候就須要可以解密出來的算法,通常在這個環節,後臺會使用對稱加密算法加密你的手機號入庫,這個操做是須要一個加密祕鑰的, 當要給你發一些營銷信息等等的時候,再用該密鑰解密出來就能夠了。html

不須要解密的算法有不少種,如md5,sha1,sha0, sha256, sha384等,下面舉幾個例子前端

// node.js
require('crypto')
.createHash('md5'|'sha'|'sha1'|'sha256')
.update('password', 'utf8')
.digest('hex');

# mysql
select MD5|SHA|SHA1('password');
select SHA2('password', 256| 384 | 512);複製代碼

如上均可以達到加密的效果,至於各類方式的差異來講,md5和sha,sha1在目前來講已經在高標準加密的場合被啓用了,例如之前github的log是sha1的,後來更換到了 sha256,由於位數較短,在運算愈來愈快的計算機環境下,逆向破解的過程也被加快,從而變得不安全。說明一下,上述的任何加密算法都是有可能被逆向破解出來的,只 是運算力夠不夠,運算的時間長不長的問題。由於加密以後的結果終歸是有限結果集,就如256位的sha2算法,他有2的256次方的結果,當你枚舉完後全部結果,是否是就 會有一種和你輸入的密碼達到一樣的效果,從而冒充你登陸網站不安全呢,固然目前這很難作到,因此說這個算法在如今是很安全的。java

對稱加密的算法,AES,DES、TripleDES、RC二、RC四、RC5和Blowfish等,還有用過ss軟件的同窗必定知道選method這個的時候要選擇一個算法爲你 的數據加密,在那裏的算法都是對稱加密方式的。以下代碼爲對稱加密例子node

// node.js
const aes = require('crypto').createCipher('aes192', 'my-key')
const secret = aes.update('手機號','utf8', 'hex') + aes.final('hex')
console.log(secret);
const des = require('crypto').createDecipher('aes192', 'my-key')
des.update(secret, 'hex', 'utf8')
console.log(des.final('utf8'));

//mysql-aes
require('mysql-aes').encrypt('手機號碼', 'my-key');
require('mysql-aes').decrypt('480AE3E13FA619C5CBF3921E447A6C79', 'my-key');
複製代碼
# mysql
select AES_decrypt(AES_ENCRYPT('手機號碼', 'my-key'), 'my-key')
select DES_decrypt(DES_ENCRYPT('手機號碼', 'my-key'), 'my-key')複製代碼

當咱們在註冊的過程當中,甚至連手機號都不想暴露,可是又不能使用對稱加密,由於對稱加密須要祕鑰協做完成,此時咱們就須要一種新的方式完成,首先要使得前端傳輸的 數據加密,其次註冊信息在後臺還要能解析開,這時候就須要兩把鑰匙,一把可以公開的,一把不能公開的,它兩必須是一對一的,客戶端拿到公開的鑰匙將數據加密,返回 至服務端,服務端拿私有的鑰匙解開數據,完成過程,該過程就叫作非對稱加密。mysql

對稱加密相比非對稱加密更加高效快速,而非對稱加密則更加安全,因此使用的過程當中應該有所選擇,選擇合適的方式。
git

3.https與加密算法

在沒有https以前咱們使用http,它就屬於「裸奔」的那種,全部數據交換信息都是明文傳輸,安全性較低。https的出現就是爲傳輸數據加鎖,提升安全性與可靠性,https等於http加SSL/TLS,https中既有對稱加密也有非對稱加密,它就是充分利用各個算法優勢。https原理可看這邊文章,我以爲寫的很棒。github

4.md5碰撞

碰撞的意思就是有兩個不一樣的來源卻得出相同的結果。學習的時候,看到的例子。算法

const crypto = require('crypto');
const hexStr2hexArr = str => {  
  let result = []  
  for(let i = 0; i<str.length/2; i++) {    
    const hexStr = str.slice(i*2, (i+1)*2)    
     result.push(parseInt(hexStr, 16))
  }  
  return result
}
var tst = '0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc942feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef'
var tst1= '0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc942feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef'
var bt = hexStr2hexArr(tst)console.log(bt)var bt1 = hexStr2hexArr(tst1)console.log(bt1)const hash = crypto
 .createHash('md5')
 .update(Buffer(bt))
 .digest('hex')const hash1 = crypto
 .createHash('md5')
 .update(Buffer(bt1))
 .digest('hex')
console.log('hash', hash)
console.log('hash', hash1)複製代碼

5.sha1碰撞

谷歌工程師對於兩張不一樣的PDF,經過sha1算法獲取文件hash值得時候,發現他們的hash徹底相等。pdf1pdf2sql

const stream1 = require('fs').createReadStream('./20181230_2.pdf')
const stream2 = require('fs').createReadStream('./20181230_3.pdf')
const hash1 = require('crypto').createHash('sha1')
const hash2 = require('crypto').createHash('sha1')
stream1.on('data', data => hash1.update(data))
stream2.on('data', data => hash2.update(data))

stream1.on('end', ()=>console.log('file1 hash', hash1.digest('hex')))
stream2.on('end', ()=>console.log('file2 hash', hash2.digest('hex')))

$ node sha1.js
file1 hash 38762cf7f55934b34d179ae6a4c80cadccbb7f0a
file2 hash 38762cf7f55934b34d179ae6a4c80cadccbb7f0a複製代碼

6.總結

加密算法只是對數據世界的給一個身份證,它是有限多的,可是數據是無限多的,任何的hash算法都是有可能出現重複的,可能性小到能夠忽略不計。


參考:https://www.jianshu.com/p/bf1d7eee28d0https://juejin.im/post/5b48b0d7e51d4519962ea383https://blog.csdn.net/caiqiiqi/article/details/68953730https://cherryblog.site/HTTPS.html

相關文章
相關標籤/搜索