題:
使用整個Unicode範圍生成隨機密碼而不是有限範圍是個好主意嗎?
person of entropy
2018-01-16 18:45:04 UTC
view on stackexchange narkive permalink

我知道一個事實,即某些安全性較低的網站/應用程序僅將密碼限制為字母數字字符,而某些允許稍寬的ASCII範圍。某些網站/應用程序也支持Unicode。

密碼通常是指可以在任何通用鍵盤上鍵入的密碼,因此它們通常是使用常用字符生成的。但是對於僅以數字方式保存的密碼,通過使用整個Unicode字符範圍來最大化猜測時間是個好主意嗎?還是有理由相信某些或大多數支持Unicode的網站/應用仍可能限制其允許的字符範圍?

每當您“僅以數字方式”保存密碼時(對我來說這聽起來像“密碼管理器”),您是否總能在沒有Unicode和僅字母數字字符的情況下創建具有高熵的密碼?或者換句話說-如果我錯了,請糾正我:我假設允許您使用Unicode密碼的服務沒有嚴格的長度限制,因此在使用字母數字字符時,熵不是問題。另一方面,具有不必要的長度限制的服務將不允許Unicode字符。無論哪種方式,熵都會是一個問題。
您可以使用更長的密碼,以免頭痛。
請注意不同系統如何解釋unicode字符串,並非所有應用程序,主機,數據庫等都必須以相同方式處理unicode:https://security.stackexchange.com/a/85664/36538
還與之相關:[非鍵盤字符會使我的密碼更不容易遭受暴力破解嗎?](https://security.stackexchange.com/questions/4632/do-non-keyboard-characters-make-my-password-less-易受蠻力攻擊),[將在我的密碼中使用Unicode字符會提高安全性嗎?](https://security.stackexchange.com/questions/4943/will-using-unicode-chars-in-my-password-增加安全性),[為什麼將密碼限制為ascii可打印字符?](https://security.stackexchange.com/questions/5694/why-limit-passwords-to-ascii-printable-characters?rq=1)
您必須*非常*謹慎使用此服務。如果您突然發現自己必須在陌生的機器上鍵入密碼,則可能會遇到很大的困難。我在goto上的例子就是我不止一次遇到的情況:必須登錄才能在酒店商務中心打印電子客票(直到我離開家才可以使用;他們需要打印,因為它們無法從手機上撕下一半的PDF以滿足其過時的系統)。隨之而來的損失可能是相當昂貴的
同意我最近將這樣生成的密碼粘貼到了我的VM管理員帳戶中,假設我將始終使用Keypass的複制/粘貼進行登錄。但是,登錄提示不接受粘貼,也不能從Keypass自動鍵入high-Ascii。我不得不花費幾個小時來學習和寫下64個Alt代碼才能重新登錄。
也許只是使用更長的密碼。如果以編程方式進行處理,則長度不是問題。
如果不用於人工輸入,為什麼不只是隨機字節序列?否則,如果您讓我鍵入“ᚷᛖώдლಸஇ을body”作為我的默認密碼,我可能會希望您活著。
還涉及到:[創建密碼時應允許用戶使用他們想要的任何特殊字符嗎?](https://ux.stackexchange.com/q/72568/46361)。(是的,這是一個受歡迎的問題。)
並不是說它真的很重要,但是我認為問題和答案中對“ Unicode”的大多數使用在技術上應該是“ UTF-8”。(Unicode在字符到數字之間映射; UTF-8在數字到字節序列之間映射。)
您是否打算讓人們複製並粘貼密碼?否則,我看不出將其稱為“隨機Unicode密碼”與僅生成相同長度的隨機字節序列之間的區別,並且誰在乎它們是否對應於Unicode的有效編碼。
您期望產生長序列隨機字節的好處是什麼?如果您希望它們是可鍵入的,則可以使用base64對其進行編碼,但是熵將是相同的。
似乎沒有其他人提出過這個建議:***大多數人不使用英語。***支持unicode,不是某種奇怪的安全策略,而是因為地球上和互聯網上的大多數人都不會不要用英語。
我理解OP詢問的是,暴力破解猜測系統是否會在每個位置循環208個鍵盤字符,而不是在每個位置設置更大的UTF-8或其他Unicode集,這會使暴力破解猜測系統更難獲得密碼。
Unicode是一堆蠕蟲,具有不可打印的,組合的,零寬度,方向改變的字符,與語言環境有關的字符串比較以及我不希望知道的東西。除非您真的知道自己在做什麼,否則請遠離,否則會使您的生活痛苦不堪。
@TomK。“每當您“僅以數字方式”保存密碼時(對我來說這聽起來像是“密碼管理器”)” –您可能需要密碼才能訪問密碼管理器。
十四 答案:
Kevin
2018-01-16 20:39:47 UTC
view on stackexchange narkive permalink

這聽起來很像Fencepost Security。想像一下,您正在運行的設施周圍有500英尺高的鏈節圍欄。將圍欄高到3,000英尺,安全性將提高多少?沒有-因為任何試圖進入的人都不會爬500英尺;他們會在下面挖洞,打個洞等。

同樣,您有一個密碼,例如20個隨機字母數字字符。那是62 ^ 20的可能性。您正在考慮將其更改為20個隨機unicode字符。這樣就增加了更大的可能性空間,除了強行強制使用20個字符的隨機密碼並不是要如何妥協之外。

我喜歡這個主意,但是具有相同字符串長度(以字符為單位)的每個字符有更多的可能性可能會導致柵欄變厚,就像更多的ascii字符一樣。
@Baldrickk大多數常用的哈希算法始終不會超過72個字節。12k字節的密碼與72字節的密碼一樣安全。
@Baldrickk我認為這意味著,與暴露於蠻力攻擊的密碼相比,諸如社交工程或繞過身份驗證方案之類的可能性更大。
我應該注意的是,我的意思是隱喻。我應該更清楚了。
+1為@RickyNotaro-Garcia這是我很久以來都讀過的有關密碼安全性的最可信,最可能(最可怕)的事實。這也意味著對於除字典搜索之外的任何其他操作,都可以使用任何類型的輸入字符串和格式來實現蠻力方法,如果時間無關緊要,則簡單的十六進制數字字符串很可能會起作用。
Sjoerd
2018-01-16 18:51:14 UTC
view on stackexchange narkive permalink

從安全角度來看,這是個好主意。包含unicode字符的密碼比包含相同長度ASCII字符的密碼更難於暴力破解。即使比較字節長度而不是字符長度,這也會成立,因為Unicode使用最高有效位,而ASCII不使用最高有效位。 。我認為,如果您到處都使用Unicode密碼,則會遇到多個站點,在這些站點上登錄會遇到問題,因為開發人員未正確實現對密碼的Unicode支持。

評論不作進一步討論;此對話已[移至聊天](http://chat.stackexchange.com/rooms/71947/discussion-on-answer-by-sjoerd-is-it-a-good-idea-to-use-the-整個unicode範圍)。
更不用說,不同區域設置的不同鍵盤將為您提供不同的unicode。一台計算機上的內容可能無法在另一台計算機上使用。
Hector
2018-01-16 19:03:46 UTC
view on stackexchange narkive permalink

忽略安全性的隱喻論證是一個基本的熵問題。 8個字符的unicode密碼比8個字符的ASCII密碼更安全,但比64個字符的ASCII密碼更不安全。最重要的是,如果您需要手動輸入密碼,則隨機Unicode可能會使您的生活陷入困境。

但是在極端情況下,您需要使用在主動執行unicode的同時強制支持最大密碼長度限制(再次忽略此密碼通常表示存在其他安全漏洞),為此有一個參數。

+1為有效支持備註。具有“轉義的”字符或少於完全支持可能會非常成問題。如果不能可靠地使用它,則它不是“安全的”。
“ 8個字符的unicode密碼比64個字符的ASCII密碼安全性低。”某些系統將密碼截斷為8個字符,在這種情況下,使用8個字符的unicode密碼比使用64個字符的ASCII密碼更安全。
NH.
2018-01-16 21:56:37 UTC
view on stackexchange narkive permalink

我能想到的在密碼中使用Unicode字符的唯一正當理由是,如果某個特定站點的密碼中的字符數(而非字節數)受到限制(例如以前擁有的最多10個字符),這樣一兩天就可以輕鬆猜到。在這種情況下,您可以在要求站點所有者遵守 NIST 800-63-3和消除長度限制(並適當地進行哈希處理,這樣就不必擔心密碼存儲了。)

我還想在這裡糾正一個誤解:

Unicode使用最高有效位,而ASCII使用最高有效位

雖然對於普通ASCII是正確的,但是某些密碼管理器(例如KeePass)可以在密碼生成中使用的擴展ASCII使用每個字節的每一位,因此具有較高的熵甚至比Unicode的密度更高,Unicode仍具有某種結構來指示同一字符的以下幾個字節(請注意, 就是Unicode中的無效字節序列)。

因為一個將您限制為短密碼的網站可能甚至無法正確地散列其密碼(導致Unicode密碼失敗或與密碼一起存儲)。錯誤的編碼),您幾乎應該永遠不要浪費時間去打擾Unicode密碼,因為當您對有趣的字符分心(以及由於密碼存儲不正確而不得不重置密碼的事實)時,攻擊者可能會猜測您的(安全性)問題,或使用巧克力密碼術來訪問您的帳戶。

儘管有些人推薦了另一個用例([向您的朋友炫耀]](https://makemeapassword.ligos.net/Generate),但這是無效的,因為不應將密碼顯示給您的朋友:)。
如果服務器使用8位編碼,KeePass只能使用每個字節的每個位,KeePass知道是哪種編碼,並且每個傳輸階段都是8位透明的。從源代碼(PwCharSet.cs)看來,KeePass的錯誤命名為“高ANSI”選項僅包括U + 00A1至U + 00AC和U + 00AE至U + 00FF,即可打印的非ASCII Latin-1字符。如果密碼編碼為UTF-8,則選中“高ANSI”時的字節熵實際上會比未選中時的字節低。
(不是每個字節的熵都重要,除非密碼在被散列之前被截斷。)
@Sjoerd是正確的:ASCII是7位。8位編碼可能包含ASCII作為子集,但不是ASCII,而是一個超集。並且有許多8位編碼-即使在ISO / IEC 8859系列中也是如此。即使使用8位編碼,也會存在編碼錯誤的問題。
John Deters
2018-01-17 01:08:52 UTC
view on stackexchange narkive permalink

在某些情況下,這種方法可能降低您的整體安全性,而不是提高安全性。

信息安全性由三個屬性組成:機密性,完整性和可用性( CIA三合會)。通過只關註一個,您可以輕鬆地忽略另一個的重要性。

密碼的機密性是通過熵原理實現的:您的密碼有多“不宜使用”?通常用蠻力猜測空間的大小來度量,用2或位的冪表示。蠻力攻擊者只有這麼大的猜測能力。通過選擇更長的密碼來增加這種熵,您可以超越任何已知或預測的猜測能力。使熵超過80位(或選擇您的值)將使密碼甚至無法進入民族國家行為體。不管上面的描述是否過於簡單,關鍵是要超越“超出範圍”並不會對您的安全性產生重大影響。如果通過使用10個Unicode字符或17個ASCII字符來實現所需的熵,則與安全性無關。

可用性表示“我可以在需要時獲取數據嗎?”如果您使用完整的Unicode字符集,則冒著以下風險:不支持Unicode的各種站點,錯誤實現Unicode的瀏覽器或OS或在幕後隱式將Unicode轉換為ASCII的站點。造成的混亂會增加限制您將來訪問數據的風險。這表示將來的可用性可能會降低。

通常,攻擊者強行強行使用您的80位密碼的可能性不及遇到編碼不良,無法處理Unicode的網站的可能性高正確地。因此,您的整體安全性可能會降低而不是提高。

當然,許多站點都有密碼長度和其他限制,這些限制也極大地限制了密碼的熵。在這些情況下,假設沒有其他隱藏的缺陷,使用完整的Unicode集可能會增加密碼的熵。因此,在這些站點上,您可能會提高安全性;但實際上不可能從外部得知站點是否正確處理了您的密碼數據。

很多時候,由於對UTF-8的支持不佳,完整性也會受到威脅(至少是密碼,也許不是密碼保護的數據)。
如果站點限制您說10個字符,我非常懷疑它們將允許10個漢字。想像一下,您首先輸入密碼的站點會無提示地將其轉換為UTF-8並刪除最高位。現在你被困住了。
Tom
2018-01-17 01:07:16 UTC
view on stackexchange narkive permalink

這可能不是直接的答案,但是如果密碼僅以數字方式保存,那麼您應該問自己為什麼要生成一個 password 而不是一個字節數組。一旦您將整個內容看成簡單的字節,問題就不再適用。

長度>在與密碼有關的所有事情中的複雜性。

大多數應用程序根本不接受字節的任意數組作為密碼。例如。嘗試在您喜歡的網站上的密碼中輸入一個空字節。
@DmitryGrigoryev可能是Tom建議使用他的字節數組的十六進製表示形式。熵的來源無法通過猜測是否存在字典攻擊來找到。
從這個問題尚不清楚,OP是否正在尋找他可以在任何地方輸入的密碼,或者是否要在自己的網站上使用登錄實現。
Patrick Mevzek
2018-01-18 09:19:37 UTC
view on stackexchange narkive permalink

關於您的問題的RFC:代表用戶名和密碼的國際化字符串的準備,執行和比較,其摘要為:

本文檔介紹了更新的方法用於處理代表用戶名和密碼的Unicode字符串。先前的方法稱為SASLprep(RFC 4013),它基於Stringprep(RFC 3454)。本文檔中指定的方法為處理國際化的用戶名和密碼提供了一種更可持續的方法。

如果您閱讀法語,也可以在此處找到很好的解釋: http ://www.bortzmeyer.org/8265.html

RFC的第8節專門涉及使用“任何” Unicode字符的密碼安全性,其中包括以下部分:

  • 8.1。密碼/密碼強度
  • 8.2。密碼/密碼比較
  • 8.3。標識符比較
  • 8.4。重複使用PRECIS
  • 8.5。重用Unicode
這個。補充Unicode [令人難以置信](https://eev.ee/blog/2015/09/12/dark-corners-of-unicode/)[難](https://stackoverflow.com/questions/6162484/why-是否確實有perper-avoid-utf-8-by-default / 6163129%236163129)和使用定義的規範化之類的東西對於甚至有機會使其正常工作都是必不可少的。
Boldewyn
2018-01-18 15:39:01 UTC
view on stackexchange narkive permalink

除了其他很好的答案外,我只想指出使用完整的Unicode密碼集在管道中會出什麼錯。

假設您隨機使用一個或多或少有效的UTF-8字符串,

  • 在基本多語言平面的中間有一些解釋為換行符的字符,例如 U + 2029段落分隔符 。您可能不能在普通的 <input> 字段中輸入它們。
  • 這兩種空格字符可能會或可能不會被語言的 trim()方法
  • 如果您碰巧使用了替代字符(U + D800-U + DFFF),非字符,例如 U + FDD0,專用字符或未分配的字符(儘管有效的UTF-8序列),基本上未定義任何給定工具集的行為(剝離,替換,拒絕,不執行任何操作或以下各項的任意組合)
  • ,如果您碰巧要添加變音符號,則任何正在進行的工具都可能會將其更改為 NFC或NKD表示形式,並更改了密碼中的字節。
  • 那隻是從我的頭上。我敢肯定,如果從整個Unicode範圍中選擇密碼,我會忘記很多其他可能的問題。

因此,類似於@JohnDeters的建議,這可能是一個壞主意,因為這樣一來,文本處理的可移動部分將無法提供更大的源空間。

gnasher729
2018-01-17 03:30:17 UTC
view on stackexchange narkive permalink

對安全至關重要的是密碼的熵-密碼中有多少位實際信息。

問題的另一方面是,記住密碼和鍵入密碼有多困難。想像一下,您嘗試在iPhone上鍵入密碼時,您發現自己不能(我沒有檢查鍵入任意Unicode字符的難度)。或者您意識到正確地100%輸入非常非常困難。或者,這可能需要您花很多時間-我的密碼可能具有相同的熵和更多的字符,但鍵入速度卻快一倍。您需要四次嘗試才能做到正確,而我的第一次是正確的。

Luis Casillas
2018-01-19 02:14:45 UTC
view on stackexchange narkive permalink

其他人充分說明了使用這些密碼的服務無法正確實現Unicode的風險。我將添加今天 今天提供的服務可能會明天停止這樣做,但否則我將跳過該主題。

我想說的一個要素想這裡必須考慮的一個問題是:要達到某個安全級別,密碼需要多長時間?假設我們希望我們的密碼與128位加密密鑰一樣強(對於大多數網站密碼來說,這可能是過高的;我建議使用80位)。如果您堅持使用隨機ASCII密碼,則從〜95個可打印ASCII字符中抽取的19個字符的密碼將達到該級別。 (數學:一組大約100個元素約為6.6位/元素(因為log2(10)≈3.3,而log2(100)是元素的兩倍),即128÷6.6≈19.4。因此19個ASCII字符實際上約為126位,而不是128位,而是meh。)

Unicode當前定義了大約130,000個代碼點,我們可以將其近似為2 ^ 17。這意味著要達到128位級別,您需要7個Unicode代碼點(128÷17≈7.5,所以7個代碼點僅約119位,但還是這樣)。

對於80位安全性級別,對於大多數網站,我認為比較明智,它是12個ASCII字符和5個Unicode代碼點。

您是否願意承受巨大的可用性並冒網站錯誤的風險,以便您可以擁有5個或9個7個字符的密碼,而不是12個或19個字符?我只是不認為這是值得的。

JonnyRobbie
2018-01-17 00:34:28 UTC
view on stackexchange narkive permalink

好吧,Unicode只是一個超過130000個字符的列表。 UTF-8是最常見的編碼,它根據一個規則集,將一個大數字並將其“轉換”為以256為基數的數字(或更準確地說,該規則在二進制八位字節中更有意義)。因此,如果您想使用utf-8編碼,則會受到許多規則的約束,從而有效地降低了可能需要的隨機性。而且我不知道如何使用整個Unicode解釋。

如果您不關心可打印字符,則可以考慮整個ASCII(或更可取的是8位擴展名),但是那一點,為什麼還要打擾字符解釋標準呢?那麼,您不能簡單地使用一些簡單的無格式隨機二進制結構嗎?

David M
2018-01-17 09:35:18 UTC
view on stackexchange narkive permalink

即使您僅使用數字存儲,我也不希望成為需要在其中輸入內容並且不認識(和(。(。提示:它們是雙精度和單精度-

使用此寬度敏感的示例,如其他答案中所指出的那樣,您希望它們支持這些功能-根據此處設置的SQL排序規則,密碼不正確!

allo
2018-01-18 20:25:10 UTC
view on stackexchange narkive permalink

不。您想增加指數函數的基數,同時又要冒很多事情的危險(例如,無法鍵入特殊字符的設備等)。計算unicode密碼的熵,並使ascii密碼更長,直到具有更大的熵。

az 單獨為26 ^(長度)。假設您使用Unicode獲得 256 ^(length)以及每個字符2個字節。然後,您可以在某個地方找到 26 ^(ascii_length)> 256 ^(2 * unicodelength)的收支平衡。選擇此長度作為 ascii_length ,您仍然可以寫下密碼並具有相同的安全性。

如果該站點不支持長密碼(對此感到羞恥),我會懷疑他們也不能保證良好的unicode支持。下次他們升級某些內部庫時,您可能會被鎖定。那麼,為什麼要在那裡冒險呢?還有一個很難向用戶支持解釋的問題,它幾乎不知道unicode的含義。

Jonathan Rosenne
2018-01-19 01:34:59 UTC
view on stackexchange narkive permalink

生成隨機Unicode密碼不是一個好主意,因為生成的密碼可能對用戶不可讀。但是問題的內容是關於使用Unicode密碼的,這是一個好主意,並由NIST 800-63-3部分 5.1.1.2記憶秘密驗證者建議:

驗證者必須要求用戶選擇的存儲秘密的長度至少為8個字符。驗證者應允許用戶選擇的記憶秘密,其長度至少為64個字符。在存儲的機密中,應接受所有印刷ASCII [RFC 20]字符以及空格字符。

出於上述長度要求的目的,每個Unicode代碼點也應計為一個字符。

繼續:

如果存儲的機密中接受Unicode字符,則驗證者應使用Unicode標準附件15第12.1節中定義的NFKC或NFKD歸一化對穩定字符串應用歸一化過程。

總結:Unicode的使用增加了熵,並使不精通英語的用戶的生活更加輕鬆。

您能詳細說明一下這對其他答案的影響嗎?
我指出了生成Unicode密碼和選擇一個Unicode密碼之間的區別,並且熵沒有像其他答案所聲稱的那樣減少,而是增加了,因為應該計算字符而不是位數。另外,NIST不僅允許使用Unicode,而且實際上建議使用Unicode,這是對該問題的直接答复。


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