我正在開發一個通過REST(前端)(JavaScript)和後端(Java / Spring)之間的REST通信的系統,並且彈出此問題。
這是否使該系統更安全地命名變量,網址等不是英語的語言?
我想這可能是因為,因為最重要的編程語言是英語,所以大多數程序員可能至少知道其中的一點。用另一種語言來命名我們的內容可能會增加黑客攻擊的難度,因為攻擊者將很難理解其含義和作用。
我無法在Google上找到結果,因為“對”一種“語言”進行了編程在一起,就不可能找到有關“語言”其他含義的結果。
我正在開發一個通過REST(前端)(JavaScript)和後端(Java / Spring)之間的REST通信的系統,並且彈出此問題。
這是否使該系統更安全地命名變量,網址等不是英語的語言?
我想這可能是因為,因為最重要的編程語言是英語,所以大多數程序員可能至少知道其中的一點。用另一種語言來命名我們的內容可能會增加黑客攻擊的難度,因為攻擊者將很難理解其含義和作用。
我無法在Google上找到結果,因為“對”一種“語言”進行了編程在一起,就不可能找到有關“語言”其他含義的結果。
從技術上講,是的。但是:
考慮所有因素,這可能永遠都不值得它。
它不會更加安全。逆向工程師經常被迫使用沒有完整原始名稱的系統(生產軟件通常會刪除符號名稱),因此他們習慣於處理由計算機生成的名稱。摘自Wikipedia的示例,其中經常出現這種反編譯的C代碼片段:
struct T1 * ebx; struct T1 {int v0004; int v0008; int v000C;}; ebx->v000C-= ebx->v0004 + ebx->v0008;
習慣使用這種表示形式的人們不會因使用變量而被愚弄給出不相關的名稱。 這並非特定於編譯後的代碼,使用C只是一個示例。逆向工程師通常習慣於理解不直觀的代碼。無論您使用的是JavaScript,Java還是C,都沒有關係。他們是否只分析與API本身的通信,甚至都沒有關係。反向工程師不會因使用隨機或無關的變量或函數名稱而被愚弄。
並非如此-所有內置函數仍將使用英語,因此無需花費額外的精力即可確定變量將要表示的內容。這可能會使某人稍微放慢腳步,但是鑑於人們仍然設法在各處使用單個字符變量對代碼進行反向工程,或者該代碼已通過混淆器運行,因此交換用於變量和函數的語言僅意味著進行查找替換。一旦弄清楚了其中一個變量的用途,然後重複進行,直到您足夠了解為止。
這是通過隱蔽實現的安全性,它將使專門的攻擊者延遲五分鐘。
如果您要使攻擊者感到困惑,將他們的對立或無關的事物命名會產生相同的效果。因此,您的“創建用戶”功能可以命名為“ BakeCake”。現在您可以回答自己給您帶來多少安全保障。實際上,這將更是安全的,因為不能僅僅通過使用字典來克服它。
是的,一開始它會造成混淆,但是請看一下其中的系統操作,一切立即變得清晰起來。
您的系統必須本身是安全的。如果它依賴於用戶端javascript傳遞的值為“ open sesame”的參數,則說明您做錯了。
您應使用對您更方便的語言(例如基於
其他答案已經指出,它實際上並不能真正提供安全性。如果您想製作一個安全的程序,而不是擔心潛在的黑客容易閱讀您的代碼並學習一個秘密漏洞,那麼您可能應該更多地考慮使它對正在審核的人可讀。
>如果有一個稱為nonce的函數參數,並且有一條註釋說明我們如何確保它在請求中是唯一的,但未在請求中發送,則可以確定它是一個錯誤。實際上,使代碼易於閱讀將減少該參數被刪除/清空的機會(畢竟,沒有它的所有工作...),或者,如果確實發生這種情況,則使您的另一個代碼更容易開發人員注意到了這個問題。
(第三方也可能會提示您有關此問題。很可能有更多人對它有個隨意的外觀,而不是真正試圖破壞它的人。隨機攻擊者很可能會首先啟動一個自動化工具,希望它能找到任何東西。)
TL; DR:生成可讀代碼。對於應該處理它的人。如有疑問,您應該選擇大多數人都知道的那種。
通過使系統難以維護,甚至可能使情況變得更糟。
以受歷史啟發的極端示例為例,並在 Navajo中進行前端和後端之間的通信。當(如果不是)您需要修補代碼時,您需要執行以下操作之一:
我還要指出,在大多數情況下,對於客戶端javascript來說,開發的腳本(帶有有意義的變量名等)將被“縮小”,以提高客戶端的性能(下載的文件較小)。
作為此過程的一部分,大多數變量名都被簡化為單個字符,並去除了盡可能多的空格。
我也將注意到chrome(例如)具有這樣的方法,這些方法需要像這樣的“不太易讀的”文件並“漂亮地打印”它,
總之,您用來編寫客戶端代碼的人工語言實際上並沒有太大的不同。
如果要相信大眾媒體,那麼大多數黑客是俄羅斯人,中國人和朝鮮人,因此他們已經已經在“必須”入侵西方系統的“障礙”下工作。非母語。因此,除非您選擇令人難以置信的東西,例如電影 Windtalkers ,否則對他們沒有任何影響。但是,為您付出的額外努力意味著您可以花更少的時間查找和修復錯誤,因此,如果有什麼辦法,這種策略會使您的安全性變得更弱。
(正確地)有幾個答復指出,這是“通過隱蔽性實現的安全性”,實際上並不是安全性的一種形式。最安全的假設是,攻擊者在忙於進行攻擊時,已經完全註釋了坐在源代碼前面的源代碼。
當知道在請求/事務/之前可以知道的所有信息時,軟件是“安全的”會話是公共知識 AND ,這對產品的實際安全性沒有影響。
必須假定源代碼是公共知識,如果僅僅是因為不僱用心懷不滿的員工當他們終止時向後開槍。或經常說:“兩個人保守秘密的唯一方法是,其中一個人死了。”因此,任何被混淆處理掩蓋的“特殊知識”一經產生,就必須假定已成為“普通知識”。
安全的核心,無非就是“說你在做什麼,然後在說你的話。”安全分析(如在通用準則下進行的代碼審核和正式評估方案)要求對執行動作的機制進行詳細記錄,並且只有在滿足所有要求的情況下,從一種安全狀態到另一種安全狀態的所有轉換才是可能的。很滿意。進行各種混淆的風險之一是,這些要求被聰明的編碼掩蓋了–請參見“ create_user()”示例失敗,因為它“秘密地”是“刪除用戶”或“重命名用戶”或其他方法。對於這種重命名在大腦上有多難的現實世界示例,有一些在線測試,在這些測試中,您必須讀取以不同顏色打印在屏幕上的顏色的名稱。例如,用藍色字體寫的單詞“ RED”將導致一定數量的人說“ BLUE”而不是“ RED”。
可能無關緊要。考慮您使用意大利語(而不是英語)進行編碼的情況,但是您的大多數客戶都在意大利,因此說意大利語的黑客自然會對攻擊您有更高的動機/收益。
在這種情況下,使用另一種語言進行編碼要么沒有效果,要么甚至使其更容易被黑客入侵。