編碼,加解密,簽名,Hash


工作中會聽到各種各樣是是而非的詞匯,base64,url,sha256,rsa,hash等等,你能很好的分清這些詞語嗎?

這次我想把它們統一的整理說明下:

一: 編碼

編碼是信息從一種形式或格式轉換為另一種形式的過程,所以他們是可逆的,不能稱之為加密。

下面列舉幾個常見的(參考編碼那些事):

html實體編碼(10進制與16進制):

如把尖括號編碼[ < ]  -----> html十進制: &#60;  html十六進制:&#x3c;

javascript的八進制跟十六進制:

如把尖括號編碼[ < ]  -----> js八進制:\74  js十六進制:\x3c

jsunicode編碼:

如把尖括號編碼[ < ]  ----->jsunicode:\u003c

url編碼 base64編碼:

如把尖括號編碼[ < ]  -----> url: %3C  base64: PA==

 

你可以根據他們編碼后的特征來快速分辨一個看上去毫無意義的字符是由什么編碼轉換過來的,並試試將其轉換回去,百度有一個轉化工具:xss編碼轉換工具

如下:


 

編碼類型 特征(以什么特征字符開頭) 以“<”字符為例
html實體編碼10進制 &# &#60
html實體編碼16進制 &#x &#x3c
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編碼加密為例

(1) 被發送 文件用SHA編碼加密產生128bit的數字摘要(見上節)。
數字摘要

數字摘要

(2) 發送方用自己的私用 密鑰對摘要再加密,這就形成了數字簽名。
(3) 將原文和加密的摘要同時傳給對方。
(4) 對方用發送方的公共密鑰對摘要解密,同時對收到的文件用SHA編碼加密產生又一摘要。
(5) 將解密后的摘要和收到的文件在接收方重新加密產生的摘要相互對比。如兩者一致,則說明傳送過程中信息沒有被破壞或篡改過。否則不然。

 

三: 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是否相同。如果相同則密碼正確。反之則密碼錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM