如何加密傳輸和儲存使用者密碼

2021-09-27 10:38:59 字數 3584 閱讀 4709

近期,github被爆出,在內部日誌中記錄了明文密碼。

雖然據說影響面很小,但是網路和資料安全問題又一次被放到臺面上。大多數使用者的常用密碼就那麼幾個,一旦被黑客拿到,去其他**「撞庫」,可能會造成使用者的財產損失。

加密主要有兩種方式:對稱加密和非對稱加密。

對稱加密:在加密和解密時使用的是同乙個秘鑰。

對稱加密的模式是:

客戶端和服務端進行通訊,採用對稱加密,如果只使用乙個秘鑰,很容易破解;如果每次用不同的秘鑰,海量秘鑰的管理和傳輸成本又會比較高。

非對稱加密:需要兩個金鑰來進行加密和解密,這兩個秘鑰是公開金鑰(public key,簡稱公鑰)和私有金鑰(private key,簡稱私鑰)。

非對稱加密的模式則是:

即使黑客拿到了公鑰,沒有私鑰也是沒有辦法解密,不考慮彩虹表的情況,完全可以長期使用一對秘鑰。

最經典的非對稱加密演算法是rsa演算法。

rsa公鑰加密演算法是2023年由羅納德·李維斯特(ron rivest)、阿迪·薩莫爾(adi shamir)和倫納德·阿德曼(leonard adleman)一起提出的。公鑰私鑰成對出現,用其中乙個加密只能用另乙個解密,通常用公鑰加密私鑰解密。

為什麼rsa能夠做到非對稱加密呢?

互質關係:如果兩個正整數,除了1以外,沒有其他公因子,我們就稱這兩個數是互質關係

簡單來說,rsa利用的原理是,如果兩個互質關係的正整數的乘積足夠大,是極難進行因式分解的(目前被破解的最長rsa金鑰是768個二進位制位,而正常使用的至少是1024位的金鑰)。

通過一定的運算,把某計算結果和乘積作為公鑰,另乙個計算結果和乘積作為私鑰,即可以實現,利用公鑰進行加密,並利用私鑰進行解密。具體的數學公式推導和證明可以參考rsa演算法原理。

傳輸層面的加密解密原理講的差不多了,我們來看看github是如何傳輸賬號密碼的。

抓包看一下登入請求的request,赫然發現,密碼是通過明文傳輸的……

那麼,這種傳輸方式安全嘛?還可以,因為使用了https,但還不夠安全。

常規的http請求,所有資訊明文傳播,只要中間人在鏈路中的任意階段進行劫持,就會帶來三大風險:

怎麼解決這些問題?用https。

https 可以認為是 http tls tls 是傳輸層加密協議,它的前身是 ssl 協議,如果沒有特別說明,ssl 和 tls 說的都是同乙個協議。

ssl/tls協議是為了解決http的三大風險而設計的,希望達到:

說了這麼多,https做了什麼?結合以下流程圖,講解一次https請求都發生了什麼:

客戶端發起https請求

服務端的配置

一般需要向權威機構申請乙個證書(也可以自己製作,這個會在之後的中間人攻擊中講到,區別就是自己頒發的證書需要客戶端驗證通過,才可以繼續訪問,而使用受信任的公司申請的證書則不會提示),證書會生成rsa加密使用的一對公鑰a和私鑰b。

傳送證書

這個證書主要內容是公鑰a,也包含了其他資訊,如證書的頒發機構,過期時間等等。

客戶端解析證書

由客戶端的tls來完成的,主要是驗證公鑰a是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出乙個警告框,提示證書存在問題。如果證書沒有問題,那麼就生成乙個隨機值。之後就進入了不對稱加密的過程,首先用證書對該隨機值進行加密。

傳送加密資訊

這部分傳送的是用證書加密後的隨機值,目的就是讓服務端得到這個隨機值,後續所有的資料都可以用這個隨機值(即私鑰c),進行對稱加密和解密。

服務端解密資訊

服務端用私鑰b解密後,得到了客戶端傳過來的私鑰c,到此rsa非對稱加密的過程結束了。

傳輸加密後的資訊

服務端用私鑰c加密資訊。

客戶端解密資訊

客戶端用之前生成的私鑰c解密服務端傳過來的資訊,於是獲取了解密後的內容。整個過程第三方即使監聽到了資料,也束手無策。

上面的過程,看起來似乎無懈可擊?並不是,因為「人」才是安全系統中最脆弱的環節。

https資訊的安全,完全建立在證書可信的基礎上,如果中間人偽造證書怎麼辦?

黑客自己偽造的證書需要客戶端驗證通過,才可以繼續訪問,只要客戶端驗證通過,那麼公鑰a,私鑰b和私鑰c對黑客來說都是透明的,也有沒有資料安全可言了,所以黑客只要誘導使用者安裝自己偽造的證書即可,例如使用各種釣魚的不可描述**。

所以即使使用https傳輸明文密碼,也不是絕對安全的。那怎麼樣才能保證密碼安全呢?

怎麼加密的?我們發現,有這麼乙個關鍵請求:

意味著,密碼使用rsa進行加密和解密處理的。那麼流程是什麼樣的呢?

到這裡,加密傳輸的過程已經完結了,現在服務端已經收到了使用者真實的密碼(解密後的),那怎麼儲存這個密碼呢?

如果用明文儲存密碼(不管是存在資料庫還是日誌中),一旦資料洩露,所有使用者的密碼就毫無保留地暴露在黑客的面前,開頭提到的風險就可能發生,那我們費半天勁加密傳輸密碼也失去了意義。

單向加密演算法:只能從明文生成乙個對應的雜湊值,不能反過來根據雜湊值得到對應的明文。

常用的給密碼加密的演算法是幾種單向的雜湊演算法。

經常被大家用來加密的演算法有md5和sha系列(如sha1、sha256、sha384、sha512等)。

雖然用雜湊演算法能提高密碼儲存的安全性,但還是不夠安全。

通常黑客在侵入儲存密碼的資料庫之後,他會隨機猜測乙個密碼,生成乙個雜湊值。如果該雜湊值在資料庫中存在,那麼他就猜對了乙個使用者的密碼。如果沒有猜中也沒有關係,他可以再次隨機猜測下乙個密碼進行嘗試。

事實上黑客為了提高破解密碼的效率,他們會事先計算大量密碼對應的各種雜湊演算法的雜湊值,並把密碼及對應的雜湊值存入乙個**中(這種**通常被稱為彩虹表),在破解密碼時只需要到事先準備的彩虹表裡匹配即可。因此現在黑客們破解僅僅只用雜湊演算法加密過的密碼事實上已是不費吹灰之力。

鹽:乙個隨機的字串,往明文密碼裡加鹽就是把明文密碼和乙個隨機的字串拼接在一起。

為了應對黑客們用彩虹表破解密碼,我們可以先往明文密碼加鹽,然後再對加鹽之後的密碼用雜湊演算法加密。由於鹽在密碼校驗的時候還要用到,因此通常鹽和密碼的雜湊值是儲存在一起的。

採用加鹽的雜湊演算法對密碼加密,要確保要往每個密碼裡新增隨機的唯一的鹽,而不是讓所有密碼共享一樣的鹽。

雖然加鹽的演算法能有效應對彩虹表的破解法,但它的安全級別並不高,因為計算雜湊值耗時極短,黑客仍然可以用窮舉法來破解,只是增加了一些耗時。

為了應對暴力破解法,我們需要非常耗時的而不是非常高效的雜湊演算法。bcrypt和pbkdf2演算法應運而生。

這兩個演算法最大的特點是我們可以通過引數設定重複計算的次數,重複計算的次數越多耗時越長。如果計算乙個雜湊值需要耗時1秒甚至更多,那麼黑客們採用暴利法破解密碼將幾乎不再可能。破解乙個6位純數字密碼需要耗時11.5天,更不要說高安全級別的密碼了。

如果我們想要盡可能保證使用者的資訊保安,我們需要做以下的工作

以上。

如何安全的加密傳輸大檔案資料

在日常對資料處理的過程中,資料加密已經時很常見的問題了,一般的資料加密有哪些呢 rsa md5 aes base64等 rsa 是公開金鑰系統的代表 安全性 建立在具有大素數因子的合數,其因子分解困難這一法則之上 處理速度慢 金鑰管理 加解密過程中不必網路傳輸保密的金鑰 金鑰管理優於aes演算法 r...

使用者註冊登入密碼儲存傳輸方案

md5加密屬於不可逆的,同一字元,加密後的16進製制數是不變的。自從出現彩虹表,對於公司內部員工來說,可以反查資料,獲取不可能的許可權,所以出現了salt演算法。一般採用 md5註冊登入雙重加鹽密碼保護。1 為了防止底層人員和外部入侵能檢視到資料庫的使用者密碼,需要對密碼加鹽處理,使得使用者的密碼洩...

使用者密碼到底要怎麼加密儲存?

使用者密碼儲存到資料庫時,以下幾種方式是常見的密碼儲存方式 直接明文儲存,比如使用者設定的密碼是 123456 直接將 123456 儲存在資料庫中,這種是最簡單的儲存方式,也是最不安全的方式。但實際上不少網際網路公司,都可能採取的是這種方式。使用對稱加密演算法來儲存,比如3des aes等演算法,...