題:
用英語以外的其他語言編寫客戶端-服務器系統是否更安全?
GuiRitter
2018-04-30 18:48:20 UTC
view on stackexchange narkive permalink

我正在開發一個通過REST(前端)(JavaScript)和後端(Java / Spring)之間的REST通信的系統,並且彈出此問題。

這是否使該系統更安全地命名變量,網址等不是英語的語言?

我想這可能是因為,因為最重要的編程語言是英語,所以大多數程序員可能至少知道其中的一點。用另一種語言來命名我們的內容可能會增加黑客攻擊的難度,因為攻擊者將很難理解其含義和作用。

我無法在Google上找到結果,因為“對”一種“語言”進行了編程在一起,就不可能找到有關“語言”其他含義的結果。

[相關](https://security.stackexchange.com/questions/35828/obfuscating-javascript-code)
由於大小/帶寬的使用,很多JavaScript已經被混淆/最小化。
@Joe或者,[相關](https://xkcd.com/257/)
如果您將時間視為安全性的一部分,那麼_是_,錯誤的代碼需要花費更長的時間才能被破解,從而使其更加安全。
任何好的編程工具都會允許某人在一定範圍內重命名變量,因此,即使您最初不確定變量`gezhundheit`是什麼意思,也可以將其重命名為`Thing1`以使其能夠以英語(或您選擇的語言)閱讀直到您解析了它,然後將其重命名為“ BlessYou”並從那裡繼續前進。
在世界各地,人們每天都在學習英語之前先學習如何編碼,因此從某種意義上講,他們主要使用概念而非有意義的可譯詞。
您是在建議俄語,普通話,廣東話還是北印度語?無論如何,如果該語言是在沒有符號調試信息的情況下編譯的,有什麼區別?即使您的代碼可讀性強,也應該保持安全,您希望對其進行獨立檢查,對嗎?
如果您想使代碼真的很難閱讀,請使用一種通用語言,但是將您的函數,類型和變量命名為錯誤的名稱,以提供可讀但錯誤的名稱。我的客戶一直在這樣做(笑話,請參閱前面的評論。)
這會使您和攻擊者一樣困難。為了使僅攻擊者更加困難,您可以使用工具(在構建中)將項目重命名為無意義的名稱。這樣,將無法使用語言翻譯器來翻譯名稱。那將是安全方面的小改進。當然,如果您認為代碼“需要”混淆是安全的,那麼它本質上是不安全的。
@dandavis我不同意該說法。錯誤代碼通常包含更多錯誤,因此更容易進行攻擊。如果您發現了一個易受攻擊的SQL注入點,那麼您就不再在乎代碼,而只是在利用它。與其他命令注入漏洞相同:一旦找到它們,利用漏洞就需要反複試驗。了解造成安全漏洞的代碼的有限部分,可以更輕鬆地理解如何利用它,但是只要嘗試一下就可以了。錯誤的代碼=更多的漏洞=更快地找到可利用的點。
@dandavis-除了自己的偏執之外,還有什麼理由認為使用非英語語言編寫的代碼不好?
@Davor:偏執是對某觀點的不容忍。OP並不建議使用另一種口頭語言進行編碼,如果保持一致,那就很好了,問題在於使用晦澀的變量名,也就是錯誤代碼。智慧:使用斯瓦希里語名稱的法語編碼員是錯誤的代碼。
@dandavis-您清楚地寫道,使用英語以外的其他語言會使代碼不好。如果您想說些不同的話,那您就失敗了。
Dein攻擊者savoirkażdy的用語。
作為必須閱讀帶有日語註釋的代碼的人,我發現日語註釋比它們的匈牙利符號和愚蠢的變量名的混合體更易於理解。如果變量名是日語的,我認為它會更容易閱讀,因為我可以在字典中查找名稱,而不必試圖從縮寫中猜測它們的意圖。
十 答案:
Peter Harmann
2018-04-30 19:03:36 UTC
view on stackexchange narkive permalink

從技術上講,是的。但是:

  • 這將是默默無聞的安全性,這是個壞主意
  • 它不會增強您對產品的信心
  • 弄清楚做什麼是很容易的,只需要一點時間
  • Google Translate,您可以使用無意義的名稱,但仍然無濟於事
  • 這將使維護工作更加困難
  • 這將使審核工作非常困難,因為審核員可能不懂該語言

考慮所有因素,這可能永遠都不值得它。

用一些個人經驗來強調Peter關於維護的觀點:處理舊代碼或別人編寫的代碼已經很困難。添加外語將是噩夢。令人懷疑的是,如果註釋不是英語的。如果您的員工說英語以外的其他語言,可以,那麼您可以做任何您想做的事情。否則,我會給這個想法一個硬的“否”。
您說的@DoubleD:使代碼操作(又稱維護)“噩夢”,但隨後您對“是否更安全”說“強硬”?如果我不知道某個東西是如何工作的,或者如何成功修改它,那麼按照定義,這是否不是更安全的方法,就像將線軸銷添加到一個翻轉開關上以增加拾取時間一樣?
人們普遍誤以為通過默默無聞的安全本身是一個“壞主意”,但這是不正確的。一個壞主意是通過模糊來“依賴”安全性。如果您遵循其他地方的最佳做法,那麼可以將其作為深度防禦的附加組件。通常,這種策略在最壞的情況下是無用的,而在最好的情況下則幾乎沒有用。一個很好的例子是在非默認端口上運行SSH。(但是,我並不是說OP的例子是合理的)。
[*“敵人知道系統。” *](https://en.wikipedia.org/wiki/Kerckhoffs%27s_principle)
我覺得您對最後兩點輕描淡寫。這種模糊不清將使其他人更難以發現系統中的弱點,不是嗎?在我看來,我們可以期望這種做法會主動“削弱”安全性。
我看到的最大漏洞是通過檢查代碼發現的應用程序設計中的錯誤或問題。如果我必須處理名稱奇怪的變量,那麼將更加難以找到這些漏洞。如果有的話,這種方法會使IMO的安全性降低。
@dandavis修復漏洞是軟件生命週期的重要組成部分。任何使該過程複雜化的事情通常都是不好的,對於零時差尤其如此。如果減慢了開發過程,則會擴大零日漏洞的窗口。我認為這種方法沒有明顯的改進。另外,僅僅因為您的程序員不熟悉某種語言,並不意味著您的對手也是如此。我會假設有使用任何給定語言的對手,如果您的程序員不熟練,這實際上是一個障礙。
實際上,如果有人可以用不同於英語的語言對原始數據流進行解碼,那麼大多數編程語言所基於的語言將使選擇變量變得更加容易。
-1
@MaxBarraclough:“這種模糊不清將使其他人更難以發現系統中的弱點,不是嗎?”-以及答案中的最後兩個要點,在很大程度上取決於最有可能看到,審核或維護代碼的“其他人”是否能熟練使用所使用的語言而非英語。
@JonBentley,`這是一個普遍的誤解,即通過默默無聞進行安全性本身就是一個“壞主意”,但這是不正確的。“是的,嗯,你知道,那就像你的意見,伙計!-花花公子
可以肯定地說,通過模糊性來實現安全性有時是查看所有DRM的唯一方法。在這種情況下,它可能是相當有效的,但應盡可能避免使用。在這種情況下可以。同樣,如果有足夠的興趣來破壞DRM,那麼幾乎所有DRM都會早晚被破壞。
+1為維護問題。*可能*使可能的黑客感到有些困惑;它會*使*憤怒的代碼維護者從現在起五年後想找您下來,並用輪胎熨斗跪下來。那個憤怒的維護者甚至可能是你。
@JonBentley **您確切地說明了為什麼通過默默無聞的安全性_is_不好。**如果在非默認端口上運行SSH,則實際上會主動降低安全性(如果它在高端口上運行(大多數人似乎都這樣做))。您聲稱它在最壞的情況下是無用的,這完全是錯誤的。
@forest 1.我說,“經常”,這在最壞的情況下沒有用,並非總是如此。顯然,您必鬚根據具體情況決定任何給定的案例。2.您的反例表明,“天真或不正確地”實施某事是不好的,而不是通過默默無聞的安全性本身是不好的。相同的原則同樣適用於標準安全措施。許多系統都允許使用非常普通或容易被暴力破解的密碼。這並不會使密碼成為一個壞主意。
通過默默無聞的@JonBentley Security,可以提高執行錯誤操作的機會。顯然,攻擊者僅擁有算法或系統的知識不能且不能提高安全性,但這並不意味著試圖積極地阻止他們獲得此知識並不意味著會使事情變得更糟。
只要以“技術上是肯定的”開頭,我就不會出於良心反對。因為那根本不是事實。
-1
@PeterHarmann機會主義的攻擊者是否打算將時間花在首先需要代碼的自定義Web應用程序上?如果用戶界面使用的是攻擊者的語言(或他們使用的語言),那麼收集與他們所尋找的信息有關的內容和不與他們有關的信息就不會很困難。我什至沒有看到任何證據表明有任何真正的改善,即使是針對機會主義攻擊者。
@jpmc26牆,這就是為什麼我總是強調小,小,不值得等等。顯然,它並不能阻止所有機會主義的攻擊者,否則它是值得的。關於它能夠阻止任何人的想法,只是我受過良好教育的猜測,可能有人會從理論上放棄它,儘管顯然沒有適當的證據。
@Shadur:“它將*導致*五年後引起憤怒的代碼維護者想要追捕您,並用輪胎熨斗把您跪下來”-這是一個非常以英語為中心的觀點。
我之所以選擇它作為答案,是因為它總結了此處討論的大多數問題,但我真的很喜歡這份清單中沒有列出的關於系統必須安全的內容,即使攻擊者對此一無所知。
forest
2018-05-01 11:05:44 UTC
view on stackexchange narkive permalink

它不會更加安全。逆向工程師經常被迫使用沒有完整原始名稱的系統(生產軟件通常會刪除符號名稱),因此他們習慣於處理由計算機生成的名稱。摘自Wikipedia的示例,其中經常出現這種反編譯的C代碼片段:

  struct T1 * ebx; struct T1 {int v0004; int v0008; int v000C;}; ebx->v000C-= ebx->v0004 + ebx->v0008;  

習慣使用這種表示形式的人們不會因使用變量而被愚弄給出不相關的名稱。 這並非特定於編譯後的代碼,使用C只是一個示例。逆向工程師通常習慣於理解不直觀的代碼。無論您使用的是JavaScript,Java還是C,都沒有關係。他們是否只分析與API本身的通信,甚至都沒有關係。反向工程師不會因使用隨機或無關的變量或函數名稱而被愚弄。

Matthew
2018-04-30 19:03:10 UTC
view on stackexchange narkive permalink

並非如此-所有內置函數仍將使用英語,因此無需花費額外的精力即可確定變量將要表示的內容。這可能會使某人稍微放慢腳步,但是鑑於人們仍然設法在各處使用單個字符變量對代碼進行反向工程,或者該代碼已通過混淆器運行,因此交換用於變量和函數的語言僅意味著進行查找替換。一旦弄清楚了其中一個變量的用途,然後重複進行,直到您足夠了解為止。

另外,人們可以從機器代碼中逆向工程代碼。人們僅通過觀察動作時記憶的變化就知道瞭如何破解複雜的遊戲。而且這還沒有網絡前端如何迫使您提供實際的源代碼(即使是最小化的代碼,其水平也要高得多,因此模式更加明顯)。還有一些反模糊化工具,它們試圖在某種程度上撤消某些棘手的模糊化技術(當然,代碼格式化程序也有幫助)。
對於Java / JavaScript,這是正確的,但也有一些編程語言使用非英語語言的內置功能。儘管這些語言的晦澀之處可能比其功能名稱與安全性更相關。
不僅是運行時分析中的逆向工程遊戲,而且甚至可以創建完全正常工作的源代碼,這些源代碼可以編譯成完全等效的字節碼,從而將封閉源代碼遊戲變成多平台遊戲!
Tom
2018-05-01 00:11:16 UTC
view on stackexchange narkive permalink

這是通過隱蔽實現的安全性,它將使專門的攻擊者延遲五分鐘。

如果您要使攻擊者感到困惑,將他們的對立或無關的事物命名會產生相同的效果。因此,您的“創建用戶”功能可以命名為“ BakeCake”。現在您可以回答自己給您帶來多少安全保障。實際上,這將是安全的,因為不能僅僅通過使用字典來克服它。

是的,一開始它會造成混淆,但是請看一下其中的系統操作,一切立即變得清晰起來。

這樣做不會更加安全,尤其是當反向工程師(例如)通常甚至沒有原始符號名稱可以使用時,_already_習慣於使用完全虛構的名稱或標識符。
我們正在談論的是REST,即網絡應用程序。攻擊者比Java字節碼更有可能分析Web交互。
我的觀點是,即使反向工程師沒有真正進行反編譯,他們也已經習慣了這種事情。我以C逆向工程為例,寫了一個關於這種效果的答案。
在事物對立的地方命名比在外語中命名更容易引入錯誤。“然後,我們調用`create_user`,然後...等等,為什麼它總是說'帳戶不存在'?當然它不存在-這就是為什麼我要創建它!“但是+1代表您的一般觀點。
當然,這是一個愚蠢的想法,我不建議這樣做。但是從純粹的安全角度來看,它會更加安全。:-) (並非每個安全的主意都是一個好主意)
Ángel
2018-05-02 02:15:39 UTC
view on stackexchange narkive permalink

您的系統必須本身是安全的。如果它依賴於用戶端javascript傳遞的值為“ open sesame”的參數,則說明您做錯了。

您應使用對您更方便的語言(例如基於

其他答案已經指出,它實際上並不能真正提供安全性。如果您想製作一個安全的程序,而不是擔心潛在的黑客容易閱讀您的代碼並學習一個秘密漏洞,那麼您可能應該更多地考慮使它對正在審核的人可讀。

>

如果有一個稱為nonce的函數參數,並且有一條註釋說明我們如何確保它在請求中是唯一的,但未在請求中發送,則可以確定它是一個錯誤。實際上,使代碼易於閱讀將減少該參數被刪除/清空的機會(畢竟,沒有它的所有工作...),或者,如果確實發生這種情況,則使您的另一個代碼更容易開發人員注意到了這個問題。

(第三方也可能會提示您有關此問題。很可能有更多人對它有個隨意的外觀,而不是真正試圖破壞它的人。隨機攻擊者很可能會首先啟動一個自動化工具,希望它能找到任何東西。)

TL; DR:生成可讀代碼。對於應該處理它的人。如有疑問,您應該選擇大多數人都知道的那種。

當然,我從未打算將語言用作安全措施。我只是對社區對此事的想法感到好奇。
這個。您的應用程序是安全的還是不是安全的。用於命名參數的語言對其更安全的影響為零。
Chris H
2018-05-01 19:08:36 UTC
view on stackexchange narkive permalink

通過使系統難以維護,甚至可能使情況變得更糟。

以受歷史啟發的極端示例為例,並在 Navajo中進行前端和後端之間的通信。當(如果不是)您需要修補代碼時,您需要執行以下操作之一:

  • 處理您的內容是胡說八道(錯誤/錯別字的額外機會加上在非代碼上的工作時間更長) -直觀的代碼),或
  • 聘用/保持程序員流利於Navajo(一種罕見且昂貴的技能組合,可能找不到承包商)
您的比較存在嚴重問題。納瓦霍人非常罕見,不是書面語言。OP可能只是在詢問他/她所在地理位置的共同語言(即可用的開發人才庫在說這句話)。同樣,翻譯也可以在開發人員端進行維護。
-1
Paddy
2018-05-01 17:56:41 UTC
view on stackexchange narkive permalink

我還要指出,在大多數情況下,對於客戶端javascript來說,開發的腳本(帶有有意義的變量名等)將被“縮小”,以提高客戶端的性能(下載的文件較小)。

作為此過程的一部分,大多數變量名都被簡化為單個字符,並去除了盡可能多的空格。

我也將注意到chrome(例如)具有這樣的方法,這些方法需要像這樣的“不太易讀的”文件並“漂亮地打印”它,

總之,您用來編寫客戶端代碼的人工語言實際上並沒有太大的不同。

Gaius
2018-05-04 02:36:22 UTC
view on stackexchange narkive permalink

如果要相信大眾媒體,那麼大多數黑客是俄羅斯人,中國人和朝鮮人,因此他們已經已經在“必須”入侵西方系統的“障礙”下工作。非母語。因此,除非您選擇令人難以置信的東西,例如電影 Windtalkers ,否則對他們沒有任何影響。但是,為您付出的額外努力意味著您可以花更少的時間查找和修復錯誤,因此,如果有什麼辦法,這種策略會使您的安全性變得更弱。

Julie in Austin
2018-05-04 02:47:01 UTC
view on stackexchange narkive permalink

(正確地)有幾個答復指出,這是“通過隱蔽性實現的安全性”,實際上並不是安全性的一種形式。最安全的假設是,攻擊者在忙於進行攻擊時,已經完全註釋了坐在源代碼前面的源代碼。

當知道在請求/事務/之前可以知道的所有信息時,軟件是“安全的”會話是公共知識 AND ,這對產品的實際安全性沒有影響。

必須假定源代碼是公共知識,如果僅僅是因為不僱用心懷不滿的員工當他們終止時向後開槍。或經常說:“兩個人保守秘密的唯一方法是,其中一個人死了。”因此,任何被混淆處理掩蓋的“特殊知識”一經產生,就必須假定已成為“普通知識”。

安全的核心,無非就是“說你在做什麼,然後在說你的話。”安全分析(如在通用準則下進行的代碼審核和正式評估方案)要求對執行動作的機制進行詳細記錄,並且只有在滿足所有要求的情況下,從一種安全狀態到另一種安全狀態的所有轉換才是可能的。很滿意。進行各種混淆的風險之一是,這些要求被聰明的編碼掩蓋了–請參見“ create_user()”示例失敗,因為它“秘密地”是“刪除用戶”或“重命名用戶”或其他方法。對於這種重命名在大腦上有多難的現實世界示例,有一些在線測試,在這些測試中,您必須讀取以不同顏色打印在屏幕上的顏色的名稱。例如,用藍色字體寫的單詞“ RED”將導致一定數量的人說“ BLUE”而不是“ RED”。

JoaoBotelho
2018-05-01 10:15:33 UTC
view on stackexchange narkive permalink

可能無關緊要。考慮您使用意大利語(而不是英語)進行編碼的情況,但是您的大多數客戶都在意大利,因此說意大利語的黑客自然會對攻擊您有更高的動機/收益。

在這種情況下,使用另一種語言進行編碼要么沒有效果,要么甚至使其更容易被黑客入侵。

這只是規則諮詢。如果選擇的語言是大多數用戶說的一種語言,那麼該方案顯然是毫無意義的,因此我們可以肯定,提問者打算將其排除在外。
是的,但是大概在很多情況下都無法依靠開發團隊來始終了解相同的非英語語言,並且使用該應用程序的社區也不知道該語言。
實際上,有很多雙語社區和市場。意大利市場的許多開發人員都在阿爾巴尼亞,因此他們可以使用其他語言進行開發。在印度教中開發英語應用程序等時也是如此。我要指出的是,用戶/目標用戶的語言將在該因素可以提供多少“安全性”方面發揮作用。


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