題:
為什麼“自己實現”一個已知的,已發布的,被廣泛認為是安全的加密算法是錯誤的?
gaazkam
2019-05-07 15:49:52 UTC
view on stackexchange narkive permalink

我知道一般建議,我們永遠不要設計¹密碼算法。在本網站以及像Bruce Schneier這樣的專業人士的網站上,都進行了廣泛的討論。

但是,一般建議遠不止於此:它表示,我們甚至不應該比我們更明智地設計 implementation 算法,而應該堅持使用眾所周知的,經過測試的實現

這是我無法詳細討論的部分。我還對Schneier的網站進行了簡短搜索,但在那也找不到該斷言。

因此,為什麼我們也建議不要實施加密算法?對此,我最感激地提到一位著名的安全專家,他在談論這個問題。

¹這可能是一個很好的學習經歷;但是請 ,請不要使用我們設計的內容。 sub>

評論不作進一步討論;此對話已[移至聊天](https://chat.stackexchange.com/rooms/93406/discussion-on-question-by-gaazkam-why-is-it-wrong-to-implement-myself-a-已知)。
十二 答案:
MechMK1
2019-05-07 16:24:15 UTC
view on stackexchange narkive permalink

之所以要避免自己實施加密算法,是因為邊信道攻擊

什麼是邊信道?

與服務器通信時,消息的內容是通信的“主要”渠道。但是,還有幾種其他方法可讓您從溝通夥伴那裡獲取信息,而這些信息並不直接涉及他們告訴您一些信息。

這些方法包括但不限於:

  • 答复您所花費的時間
  • 服務器處理您的請求所消耗的能量
  • 服務器訪問緩存以響應您的頻率。

什麼是旁通道攻擊?

簡而言之,旁通道攻擊是對涉及這些旁通道之一的系統的任何攻擊。以以下代碼為例:

  public bool IsCorrectPasswordForUser(string currentPassword,string inputPassword){//如果兩個字符串的長度不同,則它們不相等。如果(currentPassword.length!= inputPassword.length)返回false; //如果字符串的內容在任何時候都不同,請停止並返回不相等的字符串。 for(int i = 0; i < currentPassword.length; i ++){如果(currentPassword [i]!= inputPassword [i])返回false; } //如果字符串長度相等,並且沒有任何區別,則它們必須相等。返回true;}  

此代碼在功能上似乎是正確的,如果我沒有打錯任何文字,那麼它可能會執行預期的操作。您還能發現旁道攻擊向量嗎?這是一個演示它的示例:

假設用戶的當前密碼為 Bdd3hHzj (8個字符),並且攻擊者正試圖破解該密碼。如果攻擊者輸入的密碼長度相同,則將同時執行 if 檢查和 for 循環的至少一次迭代;否則,將執行兩次。但是如果輸入的密碼短於或長於8個字符,則僅執行 if 。前者需要做更多的工作,因此比後者要花更多的時間。比較一下檢查1個字符,2個字符,3個字符等密碼所花費的時間很簡單,並且請注意,只有8個字符是唯一一個明顯不同的字符,因此很可能是正確的長度。密碼。

有了這些知識,攻擊者就可以完善他們的輸入。首先,他們嘗試通過 aaaaaaaZ 進行 aaaaaaaa ,每個操作僅執行 for 循環的一次迭代。但是,當它們進入 Baaaaaaa 時,會發生兩次循環迭代,與輸入以任何其他字符開始的輸入相比,運行同樣需要更多的時間。這告訴攻擊者用戶密碼的第一個字符是字母 B ,他們現在可以重複此步驟以確定其餘字符。

這與我的密碼有何關係

密碼代碼看起來與“常規”代碼有很大不同。查看上面的示例時,在任何重大方面都沒有似乎錯誤。這樣,當您自己執行事情時,執行應做的代碼並不會帶來嚴重的缺陷。

我能想到的另一個問題是程序員不是密碼學家。他們傾向於以不同的眼光看待世界,並常常做出危險的假設。例如,看下面的單元測試:

  public void TestEncryptDecryptSuccess(){字符串message =“這是一個測試”; KeyPair密鑰= MyNeatCryptoClass.GenerateKeyPair();
byte [] cipher = MyNeatCryptoClass.Encrypt(message,keys.Public);字符串解密消息= MyNeatCryptoClass.Decrypt(密碼,密鑰。私人); Assert.Equals(消息,decryptedMessage);}  

你能猜出是什麼問題嗎?我必須承認,這不是一個公平的問題。 MyNeatCryptoClass 實現RSA,並且在內部設置為如果未明確給出指數,則使用默認指數1。

是的,如果您使用RSA的公共指數,則RSA可以正常工作1.它實際上並不會真正“加密”任何東西,因為“ x 1 sup>”仍然是“ x”。

您可能會問自己,誰在他們的頭腦中會這麼做,但確實有這種情況

實現錯誤

實現自己的代碼可能出錯的另一個原因是實現錯誤。正如用戶 Bakuridu在評論中指出的那樣,與其他錯誤相比,加密代碼中的錯誤致命。以下是一些示例:

Heartbleed

Heartbleed可能是密碼學中最著名的實現錯誤之一。儘管不直接涉及密碼代碼的實現,但是它說明了相對“小的”錯誤會帶來多麼大的錯誤。

儘管鏈接的Wikipedia文章對此問題進行了更深入的介紹,但我想要讓Randall Munroe比我能簡明得多地解釋這個問題:

https://xkcd.com/1354/ https://xkcd.com/1354/-根據CC 2.5 BY-NC許可的圖片 sup>

Debian弱PRNG錯誤

早在2008年, Debian中就有一個錯誤影響了所使用的所有其他關鍵材料的隨機性。 Bruce Schneier解釋了 Debian團隊所做的更改以及為什麼有問題。

基本要點是,檢查C代碼中可能存在的問題的工具抱怨使用未初始化的變量。雖然這通常是一個問題,但使用本質上隨機的數據播種PRNG也不錯。但是,由於沒有人喜歡盯著警告並且受過培訓以忽略警告可能導致其自身的問題,因此在某些時候刪除了“令人反感”的代碼,從而降低了使用OpenSSL的熵。

摘要

總而言之,除非將其設計為一種學習體驗,否則請不要實現自己的Crypto!使用經過審核的加密庫,該庫旨在簡化正確的處理方式和錯誤的處理方式。因為加密很容易出錯。

評論不作進一步討論;此對話已[移至聊天](https://chat.stackexchange.com/rooms/93466/discussion-on-answer-by-mechmk1-why-is-it-wrong-to-implement-myself-a-已知-p)。
就個人而言,我會把“實現錯誤”放在第一位,因為IMO更有可能讓普通的joe開發人員犯一個錯誤,使他們的密碼很容易被破解,而不是受到旁道攻擊的打擊。我還建議您強調OpenSSL項目的維護者是經驗豐富的加密程序員,並且,如果*他們*犯了這樣一個簡單的錯誤,那麼普通的joe開發人員就不可能做得更好。
我知道我已經回答了“ for”,但是一個非常非常好的反對意見是“電子郵件驗證”的合理實現,其中包含成千上萬個廢話,儘管規則在過去30年是明確,公開且可用的。
@mckenzm為什麼?RFC-822為有效的電子郵件地址定義了一個正則表達式。
Cort Ammon
2019-05-07 19:18:46 UTC
view on stackexchange narkive permalink

提到的旁道攻擊是一件大事。我再概括一下。您的密碼庫是非常高風險/高難度的代碼。通常是 the 庫,該庫可用來保護其他軟系統的其餘部分。此處的錯誤很容易造成數百萬美元的損失。

更糟糕的是,您經常不得不與自己的編譯器抗爭。這些算法的受信任實現在許多不同的編譯器上進行了大量研究,並進行了細微的調整以確保編譯器不會做壞事。多麼糟糕?好吧,考慮一下每個人都提到的那些旁道攻擊。您仔細地編寫代碼,以避免所有這些攻擊,並且一切正常。然後,在其上運行編譯器。編譯器不知道您在做什麼。它可以輕鬆地看到您為避免側通道攻擊所做的某些事情,看到了一種更快的方法,以及優化了精心添加的代碼!這甚至出現在內核代碼中,在該代碼中,無序分配最終給了編譯器權限以優化錯誤檢查!

檢測類似的東西只能使用反彙編程序,並且要有足夠的耐心。

哦,永遠不要忘記編譯器的錯誤。上個月,我花了一周的大部分時間來跟踪我的代碼中的一個錯誤,該錯誤實際上非常好-這是我的編譯器中的一個已知錯誤,實際上是導致問題的原因。現在我很幸運,因為錯誤使我的程序崩潰了,所以每個人都知道需要做些事情。一些編譯器錯誤更細微。

稍微亂序的分配不是用密碼進行的,這是所有C和C ++開發人員都需要注意的事情。(當然,在加密代碼中它可能會更昂貴)。
@MartinBonner同意,而不是加密代碼,儘管我確實聽說它是幾年前作為MySQL的漏洞而出現的。他們“適當地”檢查了循環緩衝區溢出,但是使用指針溢出(UB)進行了檢查,因此編譯器編譯了它們的檢查。不是加密,而是加密中您無法承受的那些小事情之一。
@CortAmmon和關鍵的區別在於,當涉及加密時,人們會“非常積極地”尋找您的所有漏洞,並且有充分的理由永遠不會告訴您。他們將逐字地拋出當前存在的所有技巧,然後轉到尚未想到的事情。
期間,“依賴”未定義行為的任何代碼,而不僅僅是加密代碼,都無法被信任。調用UB的代碼本質上是沒有意義的,並且無法包含不確定性。您提到的情況是,編譯器通過應用優化來“破壞”代碼,這是源代碼錯誤的產物。那不是編譯器的錯誤,而是程序員的錯誤。
當涉及到未定義的行為時(這意味著它行為不當),它不會與編譯器發生衝突,而是會與C語言及其使UB難以發現的方法發生衝突。如果您不喜歡C,則不要使用它或正式提出修訂建議。
關於編譯器,也有可能是[惡意軟件](https://www.wired.com/2009/08/induc/)。
@AlexReinking您與GCC devs =有共同的看法。確實,UB是UB,除非您專門針對* a *編譯器及其特定行為(在這種情況下,按規範是UB,但不是針對該編譯器的UB)。該部分的目的是說明這些錯誤有多“精妙”。它甚至可以通過您的測試,適用於您的編譯器的多個版本,只有在以後升級編譯器並且編譯器對UB的響應不同時才會出現。
-1
@CortAmmon-這可能是合理的,儘管我會提醒您,UB和實現定義的行為之間存在差異。如果您遵循這種理念,那麼您還必須承認,您不僅依賴於供應商,而且還依賴於特定的版本和補丁程序級別。
@CortAmmon是的,人們追求所有可利用的軟件,但是加密貨幣被視為高價值目標,因為它用於保護有價值的東西。如果攻擊者可以利用身份驗證方案中一部分的加密庫中的漏洞來獲取對系統的訪問權限,則他們可能造成很大的損失。
擁有非常高的風險/高難度的代碼,您確實希望使用經過嚴格審查的,甚至可能是開源的加密庫。多雙眼睛發現錯誤的機率更高,而很少。
偏執狂認為擁有強大的文化會阻止人們自食其果:它保證每個人最終都使用少量的庫來進行所有加密工作……這使得任何有能力的群體都很難妥協以大約六個圖書館為目標進行交流。
@Murphy這是陰謀論的思想……這意味著您完全適合人群=)認真地說,這就是開源背後的想法。對代碼的更多關注意味著對代碼以及白帽子的關注也更多。在未來幾十年中,我們將學習(或不學習!)這個想法是否“切實”對我們有利!很好的討論!(如果我可以提供一個案例研究來進一步說明您的觀點,[Ken Thompson的登錄後門](https://www.win.tue.nl/~aeb/linux/hh/thompson/trust.html)就是一個例子。早在1984年就公開了)
@CortAmmon有點。我的首選示例是[Underhanded C Contest](http://www.underhanded-c.org/),其目標是編寫可以通過代碼審查同時包含不足之處的代碼。我有點希望有一個框架可以使人們更安全地滾動自己的代碼。首先使用標準庫進行加密...然後將其放入沙箱中,以便業餘人員可以使用自己的隨機方法使用單獨的密鑰進行分層,而不會顯著削弱內部層的風險。將擊敗針對標準庫的策略。
@Murphy似乎是失敗的秘訣。加密某些內容,然後讓其他人使用結果。嗯,讓我緩存此加密密碼的結果,如果有人再次想要它,請做一些特殊的事情。您剛剛提出了一種削弱加密的方法。
因此,為什麼我提到@iheanyi某種框架來分隔其他實現。如果您不重複使用密鑰或做類似的愚蠢操作並使用加密的數據塊,那麼與在服務器上執行任務或傳輸該加密塊的服務器上運行的所有其他隨機代碼相比,您應該再也不能削弱它了通過網絡應該能夠削弱加密。(儘管最重要的是最重要的實現很重要) 加密圖書館市場中的單一文化使整個行業變得脆弱。
@Murphy哈哈哈,您的“框架”顯然是“不要編寫錯誤的代碼或執行錯誤的代碼”。
@Murphy如果我正確地閱讀了您的內容,那麼您是在談論使用多重加密嗎?您首先使用“家庭釀造”進行加密以實現多樣性,然後在發送出去之前使用標準加密方法進行加密?當然,希望使用不同的鍵。
@CortAmmon級聯密碼,最好的算法排在第一位非常重要。 https://link.springer.com/article/10.1007/BF02620231 是的,您必須使用不同的鍵。 如果我是大型政府情報機構之一的影子人物,那麼我可能會花掉一千萬來顛覆使用最頻繁的十大加密貨幣庫中的每一個,然後再花幾百萬美元進行一場以加密貨幣討論為主題的公關活動,告訴所有人永遠不要創建自己的實現...。並稱之為一天。
Emilio M Bumachar
2019-05-07 22:52:37 UTC
view on stackexchange narkive permalink

反對使用自己的加密貨幣的理由是,即使面對大量測試,漏洞也可以隱藏在加密軟件中而沒有任何症狀。

一切似乎都可以正常運行。例如,在簽名/驗證應用程序中,驗證程序將正常運行。有效簽名,拒絕無效簽名。簽名本身看起來像是胡言亂語,但是錯誤仍然存在,等待實際的攻擊。

您是否曾經在代碼中輸入一個字符並沒有註意到,導致了編輯高亮顯示還是出現快速編譯或運行時錯誤,然後及時修復?如果它沒有突出顯示,經過編譯並且沒有明顯的症狀運行,您是否會遇到這種錯字?這就是滾動自己的加密貨幣的陷阱。

Mark
2019-05-08 01:39:00 UTC
view on stackexchange narkive permalink

即使在不可能進行旁信道攻擊的情況下,加密算法通常也具有對安全性至關重要但並不明顯的實現細節。兩個示例:

  • ECDSA簽名算法在生成簽名時需要使用隨機整數。對於使用給定私鑰生成的每個簽名,此整數必須不同。如果重新使用,獲得兩個簽名的任何人都可以使用基本的模塊化算法來恢復私鑰。 (Sony在PlayStation 3的複制保護中犯了這個錯誤,每個簽名使用相同的數字。)

  • RSA算法生成密鑰對需要生成兩個隨機的大素數。在正常情況下,恢復私鑰需要整數分解或解決 RSA問題,這都是非常慢的數學運算。但是,如果一個密鑰對與另一個密鑰對共享其素數之一,那麼只需計算兩個公共密鑰的最大公約數,就可以輕鬆地恢復兩對私鑰。 (許多路由器在第一次加電時會生成SSL證書,這時隨機性不多。有時,兩個路由器會碰巧生成具有重疊密鑰對的證書。)

Augusto
2019-05-07 16:06:35 UTC
view on stackexchange narkive permalink

我認為小寫字母是:

只要您的代碼沒有錯誤,並且可以避免代碼在每個平台(操作系統和體系結構)上遇到的陷阱,就可以實施加密算法將會運行。

例如,某些實現可能具有額外的代碼來防止邊信道攻擊。它不是算法固有的,但是必須確保實現安全。這可能是很多點中的一個。

AJ Henderson
2019-05-08 03:14:31 UTC
view on stackexchange narkive permalink

如果您自己實施加密技術並且對加密技術沒有非常紮實的理解,那麼很容易出錯。在我職業生涯中看到的自家實現中,我想不出一個沒有災難性弱點的實例,而該弱點很容易被利用,導致在大多數情況下徹底中斷或至少嚴重削弱了軟件開發能力。

此外,即使您具有執行自己的實施所需的技能和知識,對於諸如定時攻擊或實施中的實際錯誤之類的事情,針對實施本身存在其他弱點的可能性仍然很高。即使在理想情況下正常工作,也會直接洩漏信息。對於這些情況,並不是更多的人已經使用和測試了實現,而是越來越多的人希望確保它的安全性,因此實現者不一定必須更好地理解。

如果實施自己,您將看到很少的白帽子,並且可能會有大量的黑帽子,因此攻擊者的人數眾多。通過使用大型的,高度使用的實現,它平衡了攻擊它的白帽和黑帽黑客的數量,從而使攻擊更加均勻。

jl6
2019-05-09 21:00:36 UTC
view on stackexchange narkive permalink

我想提供一個略有不同的觀點...

這並不是說沒有人應該實施加密技術。畢竟,有人必須這樣做。這只是一項極其艱鉅的任務,您應該問自己是否有必要的經驗和資源可供使用。

如果您在數學和計算機科學的相關領域擁有豐富的專業知識,則有一支強大的同行評審人員團隊,可以在所有環境中進行有條不紊的認真測試,緊跟相關文獻,了解設計和實現方面的陷阱特定於加密...然後確定,繼續實施加密。

..如果您認為尚無適合您使用的產品,並且將達到您所製造的產品的水平。
drjpizzle
2019-05-09 05:29:55 UTC
view on stackexchange narkive permalink

這很快就升級了。我意識到這不會流行,但是,如果您認為自己知道自己在做什麼,並且對使用的語言和使用方式有很好的了解,那麼您可能會編寫自己的某些加密原語實現完全安全。

例如,如果您在引導某些固件之前檢查哈希與期望值是否匹配,則實施散列算法可能很好。如果說不正確的值根本沒有響應,對攻擊者的反饋就很少。

但是這種情況很少在野外發生,因為您已經想到了每種語言的SHA256實現:為什麼你會用一些不同的變量名將其複制出來嗎?發生的事情是某人決定變得聰明,或者想要一種不同的行為,或者不了解細微差別(例如旁通道等)。

社區中的想法似乎是:牛仔越少越好,嚇死大家了也許這是正確的,但我認為該建議更容易遵循,而無需發出任何似乎過於熱心的言論(例如從未實施過自己的言論)。您不了解大多數編程內容,因為它們無法按預期工作。在“給出正確答案”的意義上,加密始終如您所願。但是,知道您不知道別人對加密的了解是一項艱鉅的任務。這是人們有困難的心態。因此,人們問“我為什麼不能”,而不是“我可以證明我的事情有什麼問題”。

總的來說,我很想保持“如果您要問:不要”的立場最好的。但這並不意味著您的思維過程是錯誤的。只是那些給出建議的人並不能真正確定它不是。

值得慶幸的是,SHA-256自然可以抵抗旁通道。
“如果沒有人被允許做* X *,那麼,*誰*被允許做* X *?”的想法。在任何以“不要自己動手”結尾的問題中都很常見。我的回答不是要永遠不要實施加密代碼。這個想法是“如果您實現自己的加密代碼,您必須比平均代碼要了解更多的事情”,並且常規開發人員可能無法交付良好的加密代碼。
-1
@MechMK1這不是諷刺。SHA-256自然具有抗旁通道性,因為它使用加法,固定距離旋轉和XOR(即_ARX_函數),它們在大多數現代處理器上都是恆定時間操作。與AES不同,它不使用任何依賴於秘密的查找表。這意味著即使是簡單的實現也將抵制旁通道,而以恆定的時間實現AES則需要了解底層CPU架構。
實際上,對於MD4,MD5,SHA-1,SHA-2系列的其餘部分以及RIPEMD160,也是如此,它們都是密切相關的ARX哈希值(它們的設計都源自MD4,並且以各種方式對其進行了改進)。還有一些_ciphers_自然抗旁通道,例如ChaCha20。幾乎任何純ARX功能都將易於實現,而無需擔心恆定時間行為。
DrM
2019-05-09 22:36:58 UTC
view on stackexchange narkive permalink

很簡單,較老的更廣泛使用的加密軟件已經經受了更多的測試(友好和不友好)和更多的分析。

此外,加密的歷史上充斥著損壞的軟件,其中一些是由著名的專家密碼學家編寫的。

mckenzm
2019-05-08 04:48:34 UTC
view on stackexchange narkive permalink

不是,這似乎是針對非專業人士的警告,以使他們更好。

如果您的語言不存在該實現,則有人需要這樣做。似乎沒有足夠的測試用例,如果您是專業人士,會進行同行評審和進一步測試。

是的,它必須正確,但是如果它是已發布的, (並且以前是用其他語言實現的),那麼它幾乎應該是樣板。

因此,也許您不應該這樣做,但是顯然有人必須這樣做。如果不這樣做,您將不得不打電話給其他人以彌補您的空白,這是絕對不希望的。

當然應該這樣寫,以便安全專業人員可以通過視覺上的可見“指紋”識別它。

我不同意加密實現“幾乎是樣板”的觀點。
另外,那麼,在沒有現有加密庫的地方,您正在使用哪種非常規語言?我的意思是,除非您使用Malbolge進行編程,並且需要專門使用Camellia密碼算法,否則您可能根本不在這條船上。
您會感到驚訝。我已經看到一些商店實現了自己的z / OS彙編器實現。這取決於現成的利息或費用。
@Kevin雖然Delphi有一個加密庫,但它有很多漏洞,其背後的開發團隊表示他們不會修復它,而是繼續出售它並拒絕對其進行修改。
..在開源的情況下,通常會有一個人的名字,它不僅僅是憑空實現的。
Wayne Werner
2019-05-10 02:44:33 UTC
view on stackexchange narkive permalink

與其他許多答案相輔相成的另一個原因是,做好加密很困難困難

正確實現加密 昂貴。

獲取加密錯誤昂貴。

因為正確實施加密是一件困難的事情,因此需要花費大量的工作。從業務角度來看,實施自己的加密不太可能有意義。

然後您就有可能出錯,這可能會帶來各種負面影響,包括罰款,不良宣傳以及更糟糕的依賴。關於應該加密的內容。

Jennifer
2019-05-08 16:59:19 UTC
view on stackexchange narkive permalink

使用眾所周知的專業實現的算法的問題在於,保護消息所需的一切都是關鍵。如果Evelyn可以找到(或猜測)密鑰,那麼就可以對消息進行解碼。

在第二次世界大戰之前,有兩種Enigma加密機-一種用於商業,一種用於軍事。軍事版本比其他版本更複雜,更強大,當然是無法獲得的,但是任何人都可以露面併購買商業版本。密碼學家找到了其中一個,對其進行了分解和分析,並最終弄清楚瞭如何構建自己的軍事版本。 (這是德國輸掉比賽的重要原因。)

為了獲得最佳保護,必須對算法保密。而且,目前還沒有眾所周知的秘密算法。

從理論上講,您可以構建既是算法又沒有密鑰的機器。只需在不需要密鑰的情況下在計算機上運行它,並確保Evelyn永遠不會獲得該算法的副本。 (我可能不想自己做這個。)

為了獲得最佳安全性,我會先通過自己未發布的算法運行明文,然後專業實施的。當然,這僅在少數“僅通過邀請”用戶中可行;您不能將其放在GitHub上。

如果輸入的數據已經被打亂,則必須避免第二個(專業實現的)進程做不安全的事情。另一方面,許多代碼破解嘗試都是通過嘗試每個可能的鍵並在出現類似明文的內容時停止而起作用的。由於此過程的輸出需要進一步的步驟才能變得可讀,因此代碼中斷過程將不知道何時停止。

IANAC,但是我從來沒有讓這樣的事情阻止過我。

“另一方面,許多代碼破解嘗試都是通過嘗試所有可能的鍵並在出現類似明文的內容時停止而起作用的。”打破二戰中的Enigma的一個關鍵是,這麼多消息都是以“ Heil Hitler”開頭的。一旦收到不匹配的字母,請中止,增加編碼輪,然後重試。一旦獲得了完整密鑰,您就可以在當天解密其他所有內容...
這是錯誤的想法和壞建議。任何人都可以想出一種自己無法破解的加密方法。訣竅在於提出了“沒人能打破”的秘訣-如果您要保守算法的秘密,就無法確定。如果您不是密碼分析專家團隊,那麼您將很難確定自己的自製算法是否在增加/減少/損害了您所追求的真實算法的安全性。
另外,“使用眾所周知的專業實現的算法的問題在於,保護消息所需的一切都是關鍵。”-這不是一個“問題”。這是對安全性的關鍵理解。老實說,如果您真的想停止這種攻擊媒介(特定加密算法的盲目應用),只需添加一個Pepper。它可以防止相同的潛在攻擊媒介,不會引入潛在的安全漏洞,也不需要自製的安全算法實現。
如果將其發佈為RFC或Wikipedia,則很難保密。這裡的主題是“已知”方法。
-1 **您通過隱瞞來暗示安全性**,並且公然違反了Kerckhoffs的原則。那種立場不會在這個站點上獲得太多支持。
幾乎無限的壞主意。在您的方案中,僅一個人使用您的算法就必須保存它,而被攻擊者則需要進行一些微不足道的逆向工程。然後,您的整個實現就沒有意義了。這就是為什麼存在一個原則,即每種保護數據的安全方法都不能依賴未公開的實現細節。
“為了獲得最佳保護,必須將算法保密”:對不起,但這是完全錯誤的。如果您將其保密,您將永遠不會知道它是否真的很安全,或者對您而言看起來很安全,但是它可能會被其他人破壞。使用AES,RSA等的要點是,它們抵制了來自整個社區的攻擊,因此,極不可能發現只有少數(NSA?)漏洞。這些算法是如此安全,以至於即使讓敵人知道您正在使用它們也不會給他們帶來任何好處。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...