為你的PHP程式選擇合適的密碼庫(初稿)

2021-09-23 23:23:27 字數 3474 閱讀 4375

如果本文中的術語讓你感到疑惑,請先參閱密碼學術語及概念一文。

密碼學不是魔術。加密乙個應用程式並不能保證它在襲擊下的安全(特別是在你沒有設定驗證密文的情況下)。但如果出於商業需求你要確保程式的安全,傳統做法會建議你最好不要嘗試設計你自己的密碼。你應該使用已有的密碼庫。

好了,以上我都了解了。那麼我應該用哪個php密碼庫呢?

這取決於你的實際需求。讓我們來看一下一些好的選擇。(我們不會提及任何糟糕的密碼庫的。)

下面是乙個安全信任度較高的可部署在生產環境中的php密碼庫清單。本清單基於以下三項標準進行優先排序。

若正確使用,此密碼庫的安全程度如何?

風險行為的困難度如何?

乙個非密碼破譯者最大限度使用之的簡易度如何?

使用halite的好處

• 主線

• 全檔案加密(見:所有主線特徵)

• 加密cookies

• 密碼儲存

• 你不需要知道現時值是什麼,你也不需要特別關注認證加密。halite會幫你做好一切。

我們建立halite以供php開發者通過乙個更簡單的介面獲取libsodium拓展的所有安全性優勢。檢視halite的相關檔案就能知道它的使用是多麼簡便。(儘管 api 是固定的,halite幫助檔案依然是不完善的。然而它已經足以涵蓋入門級的內容。)

唯一的缺陷是你必須安裝php的libsodium擴充套件包才能使用halite。因此對於很多專案來說,halite方式是行不通的。

安裝指南:

安裝php的libsodium擴充套件包

需要 paragoniehalite`

使用libsodium的優勢

• 對稱金鑰加密認證(同:aead)

• 對稱金鑰認證

• 非對稱金鑰認證加密

• 非對稱金鑰匿名加密

• 非對稱金鑰數字簽名

• 加密雜湊函式

• 密碼儲存

• 瑞士軍刀式的密碼學原語(比如:基於curve25519的diffe-hellman金鑰交換協議的橢圓曲線)

• 在php中的記憶體清除(補零)能力

• 還有好多

請向frank denis以及創作了nacl(libsodium由此分生)的小組致敬,因為libsodium一直是世界上最可靠的,跨平台的密碼學庫。

安裝指南

請參閱相關檔案。

如果你不能從pecl(也就是永遠不能安裝libsodium)安裝php拓展包,這個密碼庫應該是你的備用選擇。通常情況下,不論你的框架提供了什麼方案,你都應該優先考慮它,因為我們的安全小組經常能發現php框架提供的對稱金鑰加密功能的缺陷。

使用defuse security 的 php密碼庫的優勢:

• symmetric-key authenticated encryption

• 對稱金鑰認證加密

它解決了大多數人都會遇到的乙個問題(並且解決得非常棒)。該密碼庫的第二版(即將發布!)將同樣涵蓋全檔案加密,但是由於它還未發布,因此我們還不能以此為加分項。

phpseclib - jim wigginton, et al. (僅對 rsa 而言)

如果你一定要安裝對稱金鑰加密,請使用上述的defuse的密碼庫。defuse security的密碼庫為你提供了認證加密,而phpseclib的aes實施並不會驗證密文。因此如果你使用它,你對選擇密文攻擊的抵抗力將十分脆弱。(他們的互動檔案在ecb模式下同樣出錯嚴重,是我們提過的最壞分組密碼模式。)

儘管phpseclib為通用對稱秘鑰加密方式提供的 api 等級過低,使得我們不願向缺乏密碼學背景的php開發者在這種使用方式下推薦它,但是它相對extopenssl而言提供了一種更好的非對稱秘鑰加密方式。

如果你堅持必須使用非對稱秘鑰加密方式(公共秘鑰加密,電子簽名)並且出於各種原因無法使用libsodium,那麼你就應該考慮安裝phpseclib,並且嚴格遵循colin percival提出的密碼演算法的正確解答。

特別注意

signature scheme),再次明確指定使用mgf1+sha256

如果你剛好是一位密碼學專家,那你可以忽略我們的警示資訊,使用phpseclib提供的對稱秘鑰加密方式。但是對大多數非密碼學專家的程式設計者來說,請最好不要忽略我們的提示。

使用phpseclib的優勢:在本篇部落格發布以後,我們又針對建議開發了插入式安裝包,easyrsa。easyrsa是一種方向確定且預設安全設定的phpseclib使用。

easyrsa加密過程

問題:使用rsa加密一段超大字串,即使rsa本身也不支援加密超大字串資料。

原始解決方案是將你輸入的字串切分分塊並單獨分別加密。然而這和可怕的電碼本(ecb)模式十分相似。同樣的:它的處理程序也十分緩慢。這是個非常糟糕的解決方案。

我們的解決方案

要解密一段訊息

驗證檢驗和和版本標記

使用正確rsa私鑰來解密臨時秘鑰

使用上一步獲取的解密秘鈅來獲取明文

easyrsa只使用rsaes-oaep + mgf1-sha256 with e = 65537來進行公鑰加密,已知此種加密方式對任何padding oracle攻擊都是有良好抵抗力的。

easyrsa 簽名方式

rsa簽名方式是相對直接的:使用rsass-pss + mgf1-sha256 with e = 65537來計算rsa簽名,然後校驗它是否設定為僅接受此種簽名。

但是認真講,如果你真的想為你的php程式找到一種確保安全的加密方式,請嘗試尋找能使用libsodium的方式。我們正推動使libsodium成為php7.1中的核心拓展包,因此希望它的使用能夠在將來同「更新新版php」一樣簡單。

任何未在上文提及的密碼庫的落選原因都可以由以下三條可能原因解釋:

我們審核了該密碼庫,但是憑心而論並不足以讓我們進行推薦。(有可能我們已經告知創作者其密碼庫存在缺陷,以便他們加以改進。)

密碼庫使用範圍太窄(比如crypt gpg),或者儘管安全,它和加密的廣泛使用情況並不相關。

我們太忙了,還沒審核該密碼庫。(我們可能還不知道有這個密碼庫的存在。)

如果你對我們認定有缺陷的密碼庫感興趣,請檢視安全建議頁以獲取更多資訊。

你不需要加密密碼,你只需要用合適的密碼雜湊演算法(雜湊密碼演算法)來雜亂密碼。當前的最佳密碼庫之一是php內建的: password_hash() andpassword_verify()。這種雜湊演算法對99%的程式設計者或企業來說都是穩定有效的。這個演算法就是這麼棒。

然而,如果你將資料庫中的密碼儲存在你網頁應用的不同伺服器中,你可以通過加密雜湊(而不是加密密碼本身)來減輕密碼入侵風險。要使用這種方式,請檢視halite密碼課程。

儘管我們僱傭了一些php開發安全的行業頂尖專家(並且我們精於應用密碼學),在不了解你的特定專案要求和風險模型的前提下,他們在寫作這篇嚮導時並不能指引你選取最符合需求的解決方案。

因此如果,比如,你需要使用非對稱加密演算法,還執意選擇使用defuse security的對稱加密密碼庫,請不要說「是paragon initiative enterprises讓我這麼幹的!」

如果你想根據自己的特定專案獲得我們的安全建議,請考慮雇用我們進行安全諮詢服務。

或者用法律術語說:此文資訊不提供任何擔保,使用風險自負。

為MySQL選擇合適的備份方式

資料庫的備份是極其重要的事情。如果沒有備份,遇到下列情況就會抓狂 update or delete whitout where table was dropped accidentally innodb was corrupt entire datacenter loses power 從資料安全的...

為MySQL選擇合適的備份方式

資料庫的備份是極其重要的事情。如果沒有備份,遇到下列情況就會抓狂 update or delete whitout where table was dropped accidentally innodb was corrupt entire datacenter loses power 從資料安全的...

為Mysql選擇合適的資料型別

前提 使用適合儲存引擎。選擇原則 根據選定的儲存引擎,確定如何選擇合適的資料型別。下面的選擇方法按儲存引擎分類 對於innodb資料表,內部的行儲存格式沒有區分固定長度和可變長度列 所有資料行都使用指向資料列值的頭指標 因此在本質上,使用固定長度的char列不一定比使用可變長度varchar列簡單。...