?? 個人主頁 極客小俊
??? 作者簡介:web開發(fā)者是辕、設計師、技術分享博主
?? 希望大家多多支持一下, 我們一起進步!??
?? 如果文章對你有幫助的話伍绳,歡迎評論 ??點贊???? 收藏 ??加關注
為什么我們要加密?
加密
是為了信息傳遞更加安全!
這樣才能更好的讓信息傳遞更具有保密性
,不會被他人隨意篡改
、也能夠讓信息真實有效的到達指定對象的手里!
我們加密的目的乍桂,多數(shù)是圍繞這上面這些情況來的!
舉個栗子
在信息通信過程當中冲杀,比如你發(fā)送一條重要信息給對方, 在這個過程中其實有很多人可以利用一些技術手段接觸到這一段信息! 如果是很重要的信息但個別人利用睹酌,說不一定就會產(chǎn)生嚴重的經(jīng)濟損失!
例如: 信息中包含了一些敏感信息,如身份證权谁、銀行卡、密碼憋沿、
而這些敏感信息是最容易被人偷窺的!
如圖
為了避免出現(xiàn)以上的情況旺芽,我們就要將信息進行加密處理
, 這樣子即便是被人拿到了關鍵信息,他也是在短時間內無法查看的,也就是讓任何第三方都無法直接讀取和讀懂的信息!
只有發(fā)送方
和接收方
能看懂整個數(shù)據(jù)傳輸?shù)男畔ⅰ?/p>
加密系統(tǒng)的簡單架構
加密
的產(chǎn)生過程辐啄,簡單點說其實就是: 明文+密鑰+算法=密文
如圖
從上面的圖來看甥绿,其實明文
和算法
都還是比較好理解,但其中有一個叫密鑰
的東西,它就好比是像彼此約定好了的暗號
一樣, 也是最簡單的加密方式!
舉個栗子
從生活中我們用一個鎖家里的門來舉例的話则披,就是家中有價值的物品共缕,就是你的明文
、那么密鑰
就是你的鑰匙
士复,那么算法
就是你是通過什么樣的情況來鎖門的! 當門鎖好之后图谷,那么一個家
就形成了一個加密
狀態(tài)了!
所以這個密鑰
通常都是需要保密的,就是這個意思阱洪,你總不可能把你的鑰匙
隨便丟吧!
對稱加密
那么在計算機中便贵,我們也一些有比較安全和常見的加密方式, 例如:對稱加密
對稱加密
其實分為兩種形式: 對稱加密
和非對稱加密
簡單的說對稱加密
也就是加密
和解密
都會使用同樣密鑰
非對稱加密
則恰恰相反,這種加密
和解密
使用的是不同密鑰
AES對稱加密算法
AES
全稱:advanced encryption standard
它是密碼學中的高級加密標準
,也是美國聯(lián)邦政府采用的區(qū)塊加密的標準,也是當下比較流行的對稱密碼算法
!
我們前面提到的對稱加密
中就包含了AES
也就是加密
和解密
都會使用同樣密鑰
的加密算法
簡單的說發(fā)送方
將明文
和密鑰
一起經(jīng)過特殊加密算法
處理后,使其變成復雜的加密密文
再發(fā)送出去!
接收方
如果想解讀明文
, 那么需要使用加密
用過的密鑰
及相同算法
然后按照與加密
時相反的順序逆推算法對密文
進行解密冗荸,才能使其恢復成可讀的明文
信息!
前面說了,在對稱AES加密算法
中承璃,使用的密鑰
只有一個, 發(fā)送方
和接收方
都使用這個密鑰
對數(shù)據(jù)進行加密
和解密
,那么這就要求解密
的一方事先必須知道加密密鑰
對吧!
如圖
這就像是它要求發(fā)送方
和接收方
在通信之前蚌本,約定一個密鑰(暗號)
對稱算法的安全性依賴于密鑰
盔粹,如果泄漏密鑰
就意味著任何人都可以對他們發(fā)送
或接收
的數(shù)據(jù)進行解密
所以密鑰
的保密性對AES
通信的安全性至關重要!
對稱加密算法
的優(yōu)點在于加密和解密
的快速
和使用長密鑰時的難破解性,而這種加密算法支持長度為 128比特
的密鑰長度, 同時也支持192隘梨、256比特
一共三種選擇!
我們知道加密的核心在于密鑰
而算法本身
其實最終都會被破解的,所以現(xiàn)在流行的密碼算法
都是公開的,所以從密碼學
的角度而言也沒有人去保密算法來提高安全性舷嗡,所以說對于現(xiàn)在某些密碼攻擊
手段對于一些高級加密標準算法
本身并沒有效果,真正核心的還是密鑰
, 這里密鑰
的長度直接就會影響到蠻力攻擊
要取得成功需要耗費相當長的時間,而這種對稱加密算法
的安全性
取決于密鑰
的保存情況來決定!
所以普通情況下轴猎,沒有特殊需求,基本上首先的是AES加密
應用場景
這里我簡單說一個案例
假設我們現(xiàn)在有一個包含用戶個人信息的JSON對象
进萄,需要進行加密處理
如下
{
"name": "張三",
"age": 30,
"email": "zhangsan@example.com",
"phone": "13812345678"
}
那么此時我們可以使用一些加密算法,比如:AES捻脖、RSA
對這個JSON對象
中的一些數(shù)據(jù)進行加密處理。
然后加密之后的數(shù)據(jù)會變成一串密文中鼠,用戶是無法直接閱讀和理解可婶。
例如:使用AES算法
加密上述JSON對象
,結果可能類似于以下形式:
{
"name": "張三",
"age": 30,
"email": "zhangsan@example.com",
"phone": "tv/yxsWlDIPHOnD50WVnFw=="
}
現(xiàn)在可以看到援雇,加密后的JSON對象
中的phone
電話字段已經(jīng)被替換為一串看似隨機的字符串扰肌,我們是無法直接讀取原始的手機號
的, 這樣也對整個JSON對象
也變得難以理解和解析。
這里加密后的JSON數(shù)據(jù)
需要解密
后才能還原為原始數(shù)據(jù)
,而解密過程
與加密相反
熊杨,
需要使用相應的解密算法
和密鑰
來還原數(shù)據(jù)曙旭。
PHP實現(xiàn)AES對稱加密
我們來實現(xiàn)一個簡單的加密案例,有興趣的朋友可以來看看,java、php晶府、python
等等用什么語言都可以!
我用php
中的OpenSSl擴展庫
來實現(xiàn)AES對稱加密與解密
不用我們去了解底層桂躏,只需要輕松幾步就可以實現(xiàn)一個簡單加密和解密
數(shù)據(jù)的過程!
代碼如下
<?php
function encryptAES($data, $key, $iv) {
$encrypted = openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
$encrypted = base64_encode($encrypted);
return $encrypted;
}
function decryptAES($encryptedData, $key, $iv) {
$encryptedData = base64_decode($encryptedData);
$decrypted = openssl_decrypt($encryptedData, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
return $decrypted;
}
// 加密數(shù)據(jù)
$data = 'Hello-World!';
$key = '0123456789abcdef';
$iv = '1234567890abcdef';
$encryptedData = encryptAES($data, $key, $iv);
echo '加密后的數(shù)據(jù):' . $encryptedData;
echo '<hr>';
// 解密數(shù)據(jù)
$decryptedData = decryptAES($encryptedData, $key, $iv);
echo '解密后的數(shù)據(jù):' . $decryptedData;
?>
效果如下
代碼分析
這里簡單的使用到了php
中OpenSSl擴展庫
的openssl_encrypt
和openssl_decrypt
函數(shù)來實現(xiàn)的AES
openssl_encrypt函數(shù)解釋
如下表
參數(shù)列表 | 含義 |
---|---|
參數(shù)1:data |
待加密的明文信息數(shù)據(jù), 也就是需要加密的數(shù)據(jù),你可以把它想象成你想要鎖起來的秘密信息 |
參數(shù)2:method |
加密方式, 也就是你想要用來加密數(shù)據(jù) 的加密算法 , 常見的加密算法包括 AES, 具體可以查看官方文檔 例如: 你使用 AES-256-CBC 算法,那么 CBC 表示加密模式 川陆,256 表示密鑰的長度 |
參數(shù)3:key |
約定加密和解密的一把鑰匙, 而這把密鑰 的長度必須與所選擇的加密算法相匹配.........例如剂习,如果使用 AES-256-xxx ,那么你的密鑰應該是 256 位長! 所以我們最好要給定相應字節(jié)長度的字符串密鑰 ,雖然有時候我們沒有定義指定長度的字符的密鑰较沪,但仍然能夠成功加密數(shù)據(jù)鳞绕,是因為PHP 的OpenSSL擴展 自動處理了密鑰的填充和生成! 但是為了確保最佳的安全性,最好顯式地指定一個符合長度要求的密鑰! 這樣可以避免任何潛在的填充問題尸曼,并確保密鑰的長度與所選加密算法的要求相匹配, 比如說: 在 AES-256 算法中们何,密鑰的長度為 32 字節(jié)(256 位)的字符串就可以了! 這里我采用的是AES ,而AES 密鑰的長度通晨亟危可以是128位冤竹、192位、256位
|
參數(shù)4:options |
它可以控制如何處理返回的數(shù)據(jù), 它有兩種常量設置方式: OPENSSL_RAW_DATA 和 OPENSSL_ZERO_PADDING 例如茬射,你可以設置 OPENSSL_RAW_DATA 常量選項鹦蠕,這樣函數(shù)會返回原始的二進制數(shù)據(jù) ,一把也都設置這個! |
參數(shù)5:iv |
它是一個初始化向量 , 用于增加加密 的安全性 和隨機性 ! 這里所謂的初始化向量 其實就是一個隨機字符串 ,但是這個隨機字符串是有一定講究的,它的字符長度 通常需要與加密模式 的要求相匹配, 也就是說不同的加密模式 可能會有不同的iv 要求, 例如: 當我們使用AES-256-CBC 加密模式時,iv 參數(shù)應該至少為16字節(jié)長度 的隨機字符串, 如果使用AES-128-CBC 加密模式時, iv 參數(shù)必須為16字節(jié)長度 的隨機字符串,多一個或少一個都會報錯! 所以iv 這個參數(shù),最好是要和加密模式 中的長度一致就行了! 為了更加安全在抛,這個iv 最好不能寫死钟病,用一種算法方式生成指定長度的iv 這樣子在每次加密操作時都會改變加密結果! |
.................................... |
返回值:成功時返回加密后的字符串
openssl_decrypt函數(shù)解釋
如下表
參數(shù)列表 | 描述 |
---|---|
參數(shù)1:data |
要解密的數(shù)據(jù)字符串,通常是由 openssl_encrypt 函數(shù)加密后的結果。 |
參數(shù)2:method |
填寫加密方式,既然要解密 那么就要知道是如何加密 的肠阱,所以這里就必須填寫與加密 時使用的算法模式相同! 例如: 加密模式 為 AES-256-CBC 那么這里就必須填寫AES-256-CBC
|
參數(shù)3:key |
解密密鑰票唆。這是用于解密的密鑰,與加密時使用的密鑰相同! 舉個生活上的案例辖所,你用什么鑰匙鎖門,那么你就要用相應的鑰匙來開門磨德,對吧! 并且這個密鑰 的長度也要一致! |
參數(shù)4:options |
數(shù)據(jù)以什么形式進行處理并返回 它有兩種常量設置方式: OPENSSL_RAW_DATA 和 OPENSSL_ZERO_PADDING , 加密時設置的什么缘回,這里就設置什么! |
參數(shù)5:iv |
解密時需要使用加密時相同的 iv
|
......................................... |
所以在上面的案例中encryptAES
函數(shù)接受要加密的數(shù)據(jù)、密鑰
和初始向量
典挑,并返回加密后的結果酥宴。
而且decryptAES
函數(shù)接受加密后的數(shù)據(jù)、密鑰
和初始向量
您觉,并返回解密后的原始數(shù)據(jù)拙寡。
特別注意的是密鑰
和初始向量
的長度,必須要符合加密算法的要求!
大致流程如下圖:
小結
看到這里你也應該大致了解了一下對稱加密
了吧, 其實關于對稱加密
還有很多有趣的內容,以后可以慢慢給跟大家分享!
如果我的博客對你有幫助、如果你喜歡我的博客內容琳水,請 “??點贊” “??評論” “??收藏”
一鍵三連哦肆糕!
如果以上內容有任何錯誤或者不準確的地方,????歡迎在下面 ?? 留個言指出在孝、或者你有更好的想法诚啃,歡迎一起交流學習??????????