工作中會聽到各種各樣是是而非的詞匯,base64,url,sha256,rsa,hash等等,你能很好的分清這些詞語嗎?
這次我想把它們統一的整理說明下:
一: 編碼
編碼是信息從一種形式或格式轉換為另一種形式的過程,所以他們是可逆的,不能稱之為加密。
下面列舉幾個常見的(參考編碼那些事):
html實體編碼(10進制與16進制):
如把尖括號編碼[ < ] -----> html十進制: < html十六進制:<
javascript的八進制跟十六進制:
如把尖括號編碼[ < ] -----> js八進制:\74 js十六進制:\x3c
jsunicode編碼:
如把尖括號編碼[ < ] ----->jsunicode:\u003c
url編碼 base64編碼:
如把尖括號編碼[ < ] -----> url: %3C base64: PA==
你可以根據他們編碼后的特征來快速分辨一個看上去毫無意義的字符是由什么編碼轉換過來的,並試試將其轉換回去,百度有一個轉化工具:xss編碼轉換工具
如下:
| 編碼類型 | 特征(以什么特征字符開頭) | 以“<”字符為例 |
| html實體編碼10進制 | &# | < |
| html實體編碼16進制 | &#x | < |
| javascript的八進制 | \ | \74 |
| javascript的十六進制 | \x | \x3c |
| jsunicode編碼 | \u | \u003c |
| url編碼 | % | %3C |
| base64編碼 | 無 | PA== |
base64編碼的內容可以參考這邊博客base64相關
二:加解密
加密的目的就是讓密文是不可逆的,除非你掌握了相關密鑰。
加解密的算法分為2種:對稱加密算法和非對稱加密算法
對稱加密算法:
| 算法 |
類型 |
分組長度 |
密鑰長度 |
| DES |
分組 |
64 |
64(56) |
| 3DES |
分組 |
64 |
64(56)*3 |
| AES |
分組 |
128 |
128\192\256 |
| SM1 |
分組 |
128 |
128 |
| SM4 |
分組 |
128 |
128 |
| RC4 |
流 |
根據加密的目的不同可以選用不同的算法,如果是用於分組的話,建議使用AES256,這個是安全的
非對稱加密算法:
| RSA |
1024/2048 |
加密/簽名 |
| ECC |
128/256 |
加密/簽名 |
| SM2 |
256 |
加密/簽名 |
非對稱加密算法有公鑰和私鑰。使用時建議使用RSA2048,這個安全的(RSA1024目前是安全的,不過隨着技術的發展,就不好說了)
如果用私鑰對信息進行加密,是做為加密來使用的,也就是說讓密文不可破解
如果用公鑰對信息進行加密,就是為了做簽名來使用的,簽名的目的是使得這個過程不可篡改,不可抵賴,不可偽造,下面簡單介紹一下簽名:
簽名:百度上的以sha編碼加密為例
三: hash
參考freebuf上的該文章:如何安全的存儲用戶的密碼
什么是hash
hash("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hbllo") = 58756879c05c68dfac9866712fad6a93f8146f337a69afe7dd238f3364946366
hash("waltz") = c0e81794384491161f1777c232bc6bd9ec38f616560b120fda8e90f383853542
Hash 算法是一種單向的函數。它可以把任意數量的數據轉換成固定長度的“指紋”,這個過程是不可逆的。而且只要輸入發生改變,哪怕只有一個bit,輸出的 hash值也會有很大不同。這種特性恰好合適用來用來保存密碼。因為我們希望使用一種不可逆的算法來加密保存的密碼,同時又需要在用戶登陸的時候驗證密碼 是否正確。
還需要注意的是用來保護密碼的hash函數跟數據結構課上見過的hash函數不完全一樣。比如實現hash表的hash函數設計的目的是快速,但是不夠安 全。只有加密hash函數(cryptographic hash functions)可以用來進行密碼的hash。這樣的函數有SHA256, SHA512, RipeMD, WHIRLPOOL等,推薦sha256。
我們平常最常聽到的hash是指hash值,最常用的是md5的hash值,網上也有很多破解md5明文的網站。
如果你准備寫認證系統,那么我參考freebuf上的文章做如下推薦:
存儲一個密碼:
1, 使用CSPRNG生成一個長的隨機鹽。 (鹽的長度與hash值的長度相同,256位)
2, 將密碼和鹽拼接在一起,使用標准的加密hash函數比如SHA256進行hash
3, 將鹽和hash記錄在用戶數據庫中
驗證一個密碼:
1, 從數據庫中取出用戶的鹽和hash
2, 將用戶輸入的密碼和鹽按相同方式拼接在一起,使用相同的hash函數進行hash
3, 比較計算出的hash跟存儲的hash是否相同。如果相同則密碼正確。反之則密碼錯誤。

