精品国产一级在线观看,国产成人综合久久精品亚洲,免费一级欧美大片在线观看

當前位置:安全行業動態 → 正文

你所知道的PHP中的公鑰加密是錯誤的

責任編輯:editor006 作者:pwn_361 |來源:企業網D1Net  2016-12-27 14:41:11 本文摘自:安全客

概述

去年,我們的安全團隊確認了 CVE-2015-7503漏洞,又名ZF2015-10,這是一個在使用RSA過程中,出現的功能上的漏洞,存在于Zend框架的密碼庫中。

PHP

這個實際漏洞(采用PKCS1v1.5 填充方法的RSA密碼“填充預言”漏洞)最初是由Daniel Bleichenbacher在1998年發布出來的。“填充預言”漏洞允許攻擊者用一個加密的消息,并多次發送修改過的密文到服務器(每一次得到一個填充錯誤的標識),根據返回的錯誤標識,有可能恢復出原始信息。

人們可能希望,任何允許攻擊者還原出原始信息的漏洞(“填充預言”已經被發現了超過十六年),開發者都應該有所了解,并減小漏洞利用的可能性。

很遺憾,當我們審察PHP軟件時(包括開源的和專用的),我們發現,即使在2016年編寫的應用層加密協議中,仍然存在這種漏洞,可以通過這種方法去攻擊。

我們相信造成這種結果的因素主要有兩個方面:

1.大多數開發人員對如何在所有語言中安全的實現公鑰加密了解不夠。

2.PHP的OpenSSL 擴展在默認配置下是不安全的,但是在實際操作中,沒有人會去修改默認配置。

快速解決方案:使用安全的PHP公鑰加密庫

如果你對這么多的“為什么不安全”不感興趣,你可以直接看這個:“為你的PHP項目選擇一個正確的加密庫”。

RSA是如何變壞的

當涉及到應用層加密,使用RSA簡直是一個錯誤。這并不意味著你的應該程序是完全失敗的。無論如何,你必須避免很多RSA的實施缺陷(有些是明示的,有些不明顯)。讓我們看一看一些PHP開發人員可能會遇到的情況。

1.默認安全配置會讓每個人都上當

在PHP中,大多數的RSA在實施過程中都會用到下面的兩個函數:

來看一個這兩個函數的原型,有一個默認配置:

RSA在實施過程中用到的兩個函數的默認值

OPENSSL_PKCS1_PADDING 常量告訴OpenSSL 擴展:”我們想用PKCS1填充方法“。但是我們之前已經說過了,采用PKCS1v1.5 填充方法的RSA密碼,存在填充預言的弱點,這一點從1998年就已經被公開了。由于攻擊者為了恢復明文,可能需要一百萬個消息的攻擊成本,因此這種攻擊更多的被普遍稱為 "百萬消息攻擊"。

解決方案是無論你什么時候使用這兩個函數,都需要使用OPENSSL_PKCS1_OAEP_PADDING常量。這個常量會強制用OAEP填充方法代替不安全的PKCS1 V1.5填充方法。

在我們的體會中,實際上沒有人這么做(除非在我們團隊中有某個人幫它指了出來):

甚至是有經驗加密開發人員,在使用RSA加密時,常常都會忘記使用OAEP。

因此,如果你需要強制使用公鑰算法(不論作為一個開發者,還是一個滲透測試者),并且當你們提到RSA算法,還談論著”2048bit密鑰夠不夠?或者需不需要用4096bit?“時,請先檢查你使用的填充方法吧。你很有可能只需要幾千條信息就能恢復出明文,從而完全將應用程序的安全性作廢。

2.直接使用RSA加密的危險性

如果你已經閱讀了前面的內容,并且已經思考過,”那好,如果我僅僅記著使用OAEP,我就可以不受阻礙,直接使用RSA加密任何信息嗎?”,沒有這么快,你最好不要用RSA加密長信息。

當面對加密長信息時,大多數開發者很聰明:他們會將信息分割成214-byte的信息塊(對于2048bit的密鑰),并且對每塊分別進行加密,可以簡單的將RSA的這種模式稱為ECB模式。

如果你這樣做,攻擊者可能不會去恢復出你的明文,但是正如之前所說過的,RSA很慢,罪犯可能會充分利用這個特點,去發動DDOS攻擊,從而很容易的擴大DDOS的影響,并且對RSA發動DDOS攻擊,不需要用明顯的攻擊方法,你可能只需要用復制、重新排序或刪除214字節塊的方法,而不是創建一個解密錯誤。

使用混合密碼體制

最好的實現公鑰密碼的方法是建立一個混合的加密體制。結合對稱密碼和非對稱密碼。這樣做有如下幾個好處:

效率高:對稱密碼加密速度比非對稱密碼快很多

適用性:對信息長度沒有實際限制

安全性:請看來面

1.混合RSA+AES

結合RSA和AES通常很有必要:

(1)用對稱密鑰,使用對稱密碼加密消息。

(2)使用公鑰密碼加密(1)中的對稱密鑰,從而讓只有私鑰的一方才可以解密出對稱密鑰,并使用它。

ZendCrypt在3.1.0版本以后,就已經支付混合RSA-AES的加密體制了,并采用了EasyRSA庫。在Zend框架說明文檔中,對它采用的混合加密方案的工作原理理解的很好。

由于現有的AES密鑰大小一定,你需要加密的數據只有16、24、或者32byte,這遠小于2048bit RSA最大允許的214bytes。實際的數據加密采用的是CBC模式的AES,或者是CTR模式的AES。對于大多數應用程序,這種加密對消息長度沒有實踐的上限。

2.混合ECDH+Xsalsa20-Poly1305

Libsodium 加密庫使用基于橢圓曲線的DH密鑰交換算法,代替RSA,用于協商共享密鑰,該共享密鑰被xsalsa20-poly1305用于消息加密和密文鑒定中。

相關功能為crypto_box()。

當你想用接收者的公鑰加密數據時(即發送者無法解密),Libsodium 的另一功能是對于每條消息,產生一個隨機的公私密鑰對,并將公鑰附在密文后面,名為 crypto_box_seal()。

針對RSA的模數攻擊是一個長期的威脅

RSA的安全性基于大數分解的困難性,然而,在不久的將來,這一安全保證會面對兩個主要威脅:

1.改進的攻擊算法有可能比“通用數域篩法”更快的從公鑰中恢復出私鑰。對橢圓曲線密碼體制沒有效果。

2.量子計算機,這貨太強大,連橢圓曲線密碼體制都能破。

目前認為,一個老練的攻擊者,有可能在短短幾個月的時間里破解出1024位RSA,但是2048bit RSA仍然是安全的,然而,如果有一種方法能突破2048位RSA,那么這種方法對4096位RSA可能也有效。

如果你打算在2016年將加密技術應用到一個新的應用程序中,有可能突破RSA的那些迫在眉睫眉睫的威脅(真正的問題是,這種突破方法對ECDH或ECDSA是不是適用)絕對應該被考慮。實際上,在未來,你最好考慮不要用RSA、DSA、或者傳統的Diffie-Hellman算法。

總結

如果你需要在你的PHP應用中添加公鑰加密算法:

1.不要用RSA。我們甚至沒有講到數字簽名,它同樣也面臨著很多尚未解決的復雜問題(細微的偽造攻擊,假冒安全證明等等)。

2.你果你必須用RSA,不要直接用RSA。最好使用混合的加密體制,結合RSA和下面的一個:

AES-256-GCM

AES-256-CTR + HMAC-SHA256 (in an Encrypt then MAC construction)

3.確保你用了OAEP,而不是PKCS1 V1.5填充。否則,這肯定是一個漏洞。

關鍵字:公鑰算法PHPZend

本文摘自:安全客

x 你所知道的PHP中的公鑰加密是錯誤的 掃一掃
分享本文到朋友圈
當前位置:安全行業動態 → 正文

你所知道的PHP中的公鑰加密是錯誤的

責任編輯:editor006 作者:pwn_361 |來源:企業網D1Net  2016-12-27 14:41:11 本文摘自:安全客

概述

去年,我們的安全團隊確認了 CVE-2015-7503漏洞,又名ZF2015-10,這是一個在使用RSA過程中,出現的功能上的漏洞,存在于Zend框架的密碼庫中。

PHP

這個實際漏洞(采用PKCS1v1.5 填充方法的RSA密碼“填充預言”漏洞)最初是由Daniel Bleichenbacher在1998年發布出來的。“填充預言”漏洞允許攻擊者用一個加密的消息,并多次發送修改過的密文到服務器(每一次得到一個填充錯誤的標識),根據返回的錯誤標識,有可能恢復出原始信息。

人們可能希望,任何允許攻擊者還原出原始信息的漏洞(“填充預言”已經被發現了超過十六年),開發者都應該有所了解,并減小漏洞利用的可能性。

很遺憾,當我們審察PHP軟件時(包括開源的和專用的),我們發現,即使在2016年編寫的應用層加密協議中,仍然存在這種漏洞,可以通過這種方法去攻擊。

我們相信造成這種結果的因素主要有兩個方面:

1.大多數開發人員對如何在所有語言中安全的實現公鑰加密了解不夠。

2.PHP的OpenSSL 擴展在默認配置下是不安全的,但是在實際操作中,沒有人會去修改默認配置。

快速解決方案:使用安全的PHP公鑰加密庫

如果你對這么多的“為什么不安全”不感興趣,你可以直接看這個:“為你的PHP項目選擇一個正確的加密庫”。

RSA是如何變壞的

當涉及到應用層加密,使用RSA簡直是一個錯誤。這并不意味著你的應該程序是完全失敗的。無論如何,你必須避免很多RSA的實施缺陷(有些是明示的,有些不明顯)。讓我們看一看一些PHP開發人員可能會遇到的情況。

1.默認安全配置會讓每個人都上當

在PHP中,大多數的RSA在實施過程中都會用到下面的兩個函數:

來看一個這兩個函數的原型,有一個默認配置:

RSA在實施過程中用到的兩個函數的默認值

OPENSSL_PKCS1_PADDING 常量告訴OpenSSL 擴展:”我們想用PKCS1填充方法“。但是我們之前已經說過了,采用PKCS1v1.5 填充方法的RSA密碼,存在填充預言的弱點,這一點從1998年就已經被公開了。由于攻擊者為了恢復明文,可能需要一百萬個消息的攻擊成本,因此這種攻擊更多的被普遍稱為 "百萬消息攻擊"。

解決方案是無論你什么時候使用這兩個函數,都需要使用OPENSSL_PKCS1_OAEP_PADDING常量。這個常量會強制用OAEP填充方法代替不安全的PKCS1 V1.5填充方法。

在我們的體會中,實際上沒有人這么做(除非在我們團隊中有某個人幫它指了出來):

甚至是有經驗加密開發人員,在使用RSA加密時,常常都會忘記使用OAEP。

因此,如果你需要強制使用公鑰算法(不論作為一個開發者,還是一個滲透測試者),并且當你們提到RSA算法,還談論著”2048bit密鑰夠不夠?或者需不需要用4096bit?“時,請先檢查你使用的填充方法吧。你很有可能只需要幾千條信息就能恢復出明文,從而完全將應用程序的安全性作廢。

2.直接使用RSA加密的危險性

如果你已經閱讀了前面的內容,并且已經思考過,”那好,如果我僅僅記著使用OAEP,我就可以不受阻礙,直接使用RSA加密任何信息嗎?”,沒有這么快,你最好不要用RSA加密長信息。

當面對加密長信息時,大多數開發者很聰明:他們會將信息分割成214-byte的信息塊(對于2048bit的密鑰),并且對每塊分別進行加密,可以簡單的將RSA的這種模式稱為ECB模式。

如果你這樣做,攻擊者可能不會去恢復出你的明文,但是正如之前所說過的,RSA很慢,罪犯可能會充分利用這個特點,去發動DDOS攻擊,從而很容易的擴大DDOS的影響,并且對RSA發動DDOS攻擊,不需要用明顯的攻擊方法,你可能只需要用復制、重新排序或刪除214字節塊的方法,而不是創建一個解密錯誤。

使用混合密碼體制

最好的實現公鑰密碼的方法是建立一個混合的加密體制。結合對稱密碼和非對稱密碼。這樣做有如下幾個好處:

效率高:對稱密碼加密速度比非對稱密碼快很多

適用性:對信息長度沒有實際限制

安全性:請看來面

1.混合RSA+AES

結合RSA和AES通常很有必要:

(1)用對稱密鑰,使用對稱密碼加密消息。

(2)使用公鑰密碼加密(1)中的對稱密鑰,從而讓只有私鑰的一方才可以解密出對稱密鑰,并使用它。

ZendCrypt在3.1.0版本以后,就已經支付混合RSA-AES的加密體制了,并采用了EasyRSA庫。在Zend框架說明文檔中,對它采用的混合加密方案的工作原理理解的很好。

由于現有的AES密鑰大小一定,你需要加密的數據只有16、24、或者32byte,這遠小于2048bit RSA最大允許的214bytes。實際的數據加密采用的是CBC模式的AES,或者是CTR模式的AES。對于大多數應用程序,這種加密對消息長度沒有實踐的上限。

2.混合ECDH+Xsalsa20-Poly1305

Libsodium 加密庫使用基于橢圓曲線的DH密鑰交換算法,代替RSA,用于協商共享密鑰,該共享密鑰被xsalsa20-poly1305用于消息加密和密文鑒定中。

相關功能為crypto_box()。

當你想用接收者的公鑰加密數據時(即發送者無法解密),Libsodium 的另一功能是對于每條消息,產生一個隨機的公私密鑰對,并將公鑰附在密文后面,名為 crypto_box_seal()。

針對RSA的模數攻擊是一個長期的威脅

RSA的安全性基于大數分解的困難性,然而,在不久的將來,這一安全保證會面對兩個主要威脅:

1.改進的攻擊算法有可能比“通用數域篩法”更快的從公鑰中恢復出私鑰。對橢圓曲線密碼體制沒有效果。

2.量子計算機,這貨太強大,連橢圓曲線密碼體制都能破。

目前認為,一個老練的攻擊者,有可能在短短幾個月的時間里破解出1024位RSA,但是2048bit RSA仍然是安全的,然而,如果有一種方法能突破2048位RSA,那么這種方法對4096位RSA可能也有效。

如果你打算在2016年將加密技術應用到一個新的應用程序中,有可能突破RSA的那些迫在眉睫眉睫的威脅(真正的問題是,這種突破方法對ECDH或ECDSA是不是適用)絕對應該被考慮。實際上,在未來,你最好考慮不要用RSA、DSA、或者傳統的Diffie-Hellman算法。

總結

如果你需要在你的PHP應用中添加公鑰加密算法:

1.不要用RSA。我們甚至沒有講到數字簽名,它同樣也面臨著很多尚未解決的復雜問題(細微的偽造攻擊,假冒安全證明等等)。

2.你果你必須用RSA,不要直接用RSA。最好使用混合的加密體制,結合RSA和下面的一個:

AES-256-GCM

AES-256-CTR + HMAC-SHA256 (in an Encrypt then MAC construction)

3.確保你用了OAEP,而不是PKCS1 V1.5填充。否則,這肯定是一個漏洞。

關鍵字:公鑰算法PHPZend

本文摘自:安全客

電子周刊
回到頂部

關于我們聯系我們版權聲明隱私條款廣告服務友情鏈接投稿中心招賢納士

企業網版權所有 ©2010-2024 京ICP備09108050號-6 京公網安備 11010502049343號

^
  • <menuitem id="jw4sk"></menuitem>

    1. <form id="jw4sk"><tbody id="jw4sk"><dfn id="jw4sk"></dfn></tbody></form>
      主站蜘蛛池模板: 汝城县| 永州市| 永泰县| 南京市| 沅陵县| 郯城县| 兴义市| 黄山市| 遂溪县| 湄潭县| 阿城市| 隆昌县| 萨嘎县| 江津市| 丽水市| 博客| 嘉义县| 霍林郭勒市| 宜都市| 利津县| 玛沁县| 新沂市| 大新县| 克拉玛依市| 岳阳县| 镇安县| 突泉县| 永嘉县| 万山特区| 富裕县| 嘉荫县| 扎兰屯市| 襄城县| 政和县| 年辖:市辖区| 肥西县| 三都| 濮阳市| 祁连县| 徐州市| 永丰县|