Tại sao jK8v!ge4D không phải một mật khẩu tốt?
Tác giả: Jacob Bergdahl
——————————————
Có một vấn đề cơ bản đối với độ mạnh của mật khẩu
——————————————
Hãy xét hai mật khẩu dưới đây:
1. jK8v!ge4D
2. greenelephantswithtophats
Bạn nghĩ việc bẻ khóa mật khẩu nào sẽ tốn nhiều thời gian hơn? Và mật khẩu nào dễ nhớ hơn? Câu trả lời cho cả hai thắc mắc trên là cái thứ 2. Tuy nhiên, mọi người lại được khuyến khích tạo những mật khẩu giống như cái số 1. Người ta được dạy rằng họ nên viết ra những mật khẩu khó nhớ đối với con người, mà không vì lí do nào cả.
Hãy nói về vấn đề này nào.
Có rất nhiều điểm kì lạ trong các chuẩn mực Internet. Tính xác thực là một trong số đó. Trên tư cách một front-end developer, tôi được kì vọng sẽ xác thực những thông tin đầu vào do người dùng nhập – thứ được gọi là trường nhập (input field). Đây là các trường mà bạn sử dụng khi nhập tài khoản, email, địa chỉ nhà, mã bưu chính của bạn, .v.v Trách nhiệm của một front-end developer là đảm bảo người dùng sẽ không nhập bất kì thứ gì độc hại và không đúng định dạng vào các trường này.
Ví dụ, một trường đòi hỏi mã bưu chính nói chung chỉ cho phép bao gồm khoảng trống và số, và nếu chúng tôi biết quốc gia nơi người dùng sinh sống, chúng tôi có thể giới hạn nó trong một số lượng kí tự nhất định. Số điện thoại thường có thể bao gồm các số, một dấu cộng (chỉ ở đầu dãy) và một dấu gạch ngang, có thể có thêm vài dấu ngoặc đơn nếu chúng tôi rộng rãi. Địa chỉ email rất khó xác thực, tuy nhiên, nó thường bao gồm một kí tự @, theo sau là một dấu chấm. Dù vậy, một địa chỉ email không bao gồm các thuộc tính trên vẫn có thể là một địa chỉ hoàn toàn hợp lệ. Một số website cố xác thực tên bằng cách buộc người dùng để tên của họ ở một độ dài nhất định, hoặc buộc họ chỉ dùng những kí tự nhất định, dù cách làm này chẳng bao giờ thực sự có hiệu quả, bởi bất cứ thứ gì cũng có thể tạo nên tên của một người mà.
Công đoạn xác thực được tiến hành vì nhiều lí do. Một trong số đó là mối lo bảo mật. Việc xác thực ngăn người dùng nhập các mã đáng sợ có thể thay đổi cơ sở dữ liệu hoặc gây ra những hành vi độc hại khác. Một cách làm khác là yêu cầu một kiểu dữ liệu cụ thể. Nếu một trường chỉ cho phép bao gồm chữ số, người kĩ sư quản lí cơ sở dữ liệu có thể thiết lập một cột cơ sở dữ liệu chỉ cho phép các chữ số, tức là một kí tự không phải chữ số sẽ bị lỗi.
Nhưng về thực chất, lí do cơ bản nhất là giúp người dùng tránh mắc phải các lỗi.
Vì một số lí do, các front-end developer được kì vọng sẽ trông nom người dùng để họ nhập vào những mật khẩu được truyền thống hóa là tốt. Nó nên có ít nhất 8 kí tự, bao gồm cả kí tự in hoa và kí tự thường, một chữ số, và nếu bạn vẫn thấy chưa yên tâm, bạn có thể chèn thêm một kí tự đặc biệt, một dấu chấm than chẳng hạn.
Đây là một ví dụ về một mật khẩu thường được coi là có hiệu lực: jK8v!ge4D. Khi xét đến sự thật rằng bạn thường được bảo đặt mật khẩu như vậy, cũng dễ hiểu khi bạn có suy nghĩ rằng một mật khẩu như vậy sẽ là tốt.
Nhưng cái mật khẩu kia không hề tốt. Còn ngu xuẩn là đằng khác. Nó tệ lắm luôn.
Thứ nhất, mọi người sao có thể nhớ nổi nó cơ chứ? Và kết quả là gì? Mọi người sẽ phải ghi mật khẩu vào một chỗ nào đó. Giấy note chẳng hạn. Và cuối cùng thì, họ bị “hack”.
Thứ hai, người dùng cuối cùng sẽ sử dụng một mật khẩu cho nhiều dịch vụ khác nhau, bởi việc quản lí cả đống mật khẩu phức tạp chẳng phải chuyện dễ chịu gì. Khi bạn tạo một tài khoản cho một website xịn xò nào đó, vài đoạn code – thứ người ta gọi là bí thuật – sẽ chuyển mật khẩu của bạn thành một hàm băm (hash) (thường bị gọi một cách không chính xác là mã hóa (encryption)). Mật khẩu của bạn trong cơ sở dữ liệu sẽ trông thế này:
k5ka2p8bFuSmoVT1tzOyyuaREkkKBcCNqoDKzYiJL9RaE8yMnPgh2XzzF0NDrUhgrcLwg78xs1w5pJiypEdFX
Cho dù cơ sở dữ liệu có bị hack, thì hacker cũng không thể thực sự làm được gì với những thông tin này. Một mật khẩu tốt vừa phải nếu được xử lí thành giá trị băm đúng cách sẽ khá an toàn. Dù vậy, việc tìm ra mật khẩu gốc là có thể, với điều kiện nó phải đủ thông dụng và thuật toán phải đủ đơn giản.
Vấn đề ở đây là không phải dịch vụ nào cũng ứng dụng hàm băm trong xử lí mật khẩu của người dùng. Nếu bạn sử dụng cùng một mật khẩu cho nhiều dịch vụ, rồi bạn sẽ dùng phải những dịch vụ được lập trình kém, và chúng thật sự có thể lưu mật khẩu của bạn dưới dạng văn bản thuần túy trong cơ sở dữ liệu của chúng. Nếu các nền tảng này bị tấn công, hacker sẽ có mật khẩu cho toàn bộ những tài khoản mà bạn sử dụng mật khẩu giống vậy. Điều này thật đáng sợ, và nó xảy ra thường xuyên hơn tần suất mà người ta có thể nghĩ tới.
Đây chính là lí do tại sao bạn PHẢI sử dụng các mật khẩu khác nhau cho các website khác nhau. Tuy nhiên, những người dùng ngày nay có tài khoản ở hàng tấn tấn website. Họ phải nhớ chúng thế nào đây? Những người dùng trình độ cao có thể sử dụng một công cụ mật khẩu, nhưng bạn không thể mong chờ những người dùng bình thường làm được điều đó.
Chà, có một cách tốt hơn ở đây.
Hãy nhìn vào xâu kí tự sau: gtypohgt. Xâu này bao gồm 8 kí tự ngẫu nhiên, tất cả đều viết thường. Một máy tính hiện đại chỉ mất chưa đến vài phút để brute force nó. Giờ thì, hãy thay vài kí tự trong đó thành chữ số nào, và mật khẩu mới sẽ bị bẻ khóa trong vòng một giờ (g9ypo3gt). Nếu có vài kí tự viết hoa, thời gian bẻ khóa sẽ kéo dài thành một ngày (g9YPo3gT). Nếu bạn ném thêm vài dấu đặc biệt, máy tính có thể sẽ phải làm việc trong một tháng (g9Y!o3gT).
(ND: Brute force là một kiểu tấn công mạng được dùng cho tất cả các loại mã hóa, hoạt động bằng cách xoay vòng các kí tự khác nhau và thử để tìm ra mật khẩu. Do đó, thời gian cần cho brute force tùy thuộc vào độ dài của mật khẩu, nhưng luôn có thể tìm ra mật khẩu nếu không có giới hạn về thời gian).
Xét về mặt kĩ thuật, g9Y!o3gT là một mật khẩu tử tế đấy. Không ai có thể đoán được nó, nó không nằm trong danh sách những mật khẩu thông dụng, và máy tính sẽ phải mất một khoảng thời gian hợp lí để bẻ khóa nó. Vấn đề là nó rất khó nhớ đối với con người – không vì lí do có thật nào cả.
Giờ thì, hãy nhìn thử nàng thơ này nào: greenelephantswithtophats (green elephants with top hats). Nó bao gồm 24 kí tự, tất cả đều viết thường. Không có chữ số, không có các kí tự ngẫu nhiên, không có thành phần vô nghĩa. Nhưng máy tính sẽ phải mất nhiều nghìn năm để bẻ khóa nó. Bạn thấy đấy, với mỗi kí tự bạn nhập vào, thời gian máy tính cần để bẻ khóa sẽ tăng lên rất đáng kể. greenelephantswithtophats không nằm trong danh sách những mật khẩu thông dụng, và cũng không ai có thể đoán ra nó.
Hãy dùng một câu chuyện để tạo mật khẩu. Bạn cần một mật khẩu Facebook ư? afaceforabookbutapizzaforahorse (a face for a book but a pizza for a horse) thì sao nhỉ? Hãy mường tượng nó đi. Trí nhớ không gian là trí nhớ mạnh mẽ nhất của chúng ta. Đột nhiên bạn có một mật khẩu cực mạnh, dễ nhớ và độc nhất cho một website cụ thể. Mật khẩu phải là thứ mà ngay cả những người hiểu bạn nhất cũng không thể đoán ra. Bạn không hay nói về rùa biển, đúng chứ? Bạn đã bao giờ nhìn thấy một con rùa màu tím chưa? Chưa à? Thế thì tưởng tượng ra nó đi. Giờ thì bạn thấy rồi đấy. Bạn hoàn toàn có thể nói dối trong mật khẩu của mình: ioncesawapurpleturtleiswear (I once saw a purple turtle I swear). Một máy tính hiện đại sẽ phải mất vài triệu năm để bẻ khóa mật khẩu này, và ngay cả em gái bạn cũng không cách nào đoán ra nó được đâu.
Một ví dụ khác: walkingdowngrandpassroadwithlittlerufus sẽ mất vài triệu năm để bị brute force. Không người nào có thể đoán ra nó – ngay cả khi có ai đó biết thú cưng của bạn tên là Rufus. Họ không thể đoán ra một câu cụ thể đúng như mật khẩu của bạn.
Những mật khẩu này rất dễ tưởng tượng ra.
flyingcarsthatcannotflyarenotflying. applesmaybegreatbutpearsarelikeheaven. goatswithshoesenjoytrainsonrainydays.
Và sẽ không ai đoán được chúng.
Tuy nhiên, một số website sẽ không cho phép những mật khẩu như vậy. Chúng sẽ kêu ca rằng bạn chưa thêm một chữ số hoặc một chữ cái in hoa, hoặc mật khẩu bạn nhập quá dài, hoặc vì vài lí do phi kĩ thuật vô lí khác.
Vậy thì bạn có thể lươn lẹo một chút mà. Hãy thêm A1! vào cuối mỗi mật khẩu trên, và mật khẩu của bạn sẽ hợp lệ với mọi hệ thống không cho rằng nó quá dài. Giờ thì bạn đã có một kí tự in hoa, một chữ số, và một dấu đặc biệt. Ngay cả khi ba kí tự phần đuôi này là giống hệt nhau đối với mọi mật khẩu của bạn, thì phần đầu mới là phần mang tính quyết định. ioncesawapurpleturtleiswear và ioncesawapurpleturtleiswearA1! đều là những mật khẩu mà máy tính không thể bẻ khóa được, tức là bạn chỉ gặp một chút bất tiện khi phải nhập những kí tự đó vào cuối chuỗi mật khẩu của bạn mà thôi.
Các developer đều có mục đích tốt. Mọi người nhập vào những mật khẩu yếu. Những người quản lí website không muốn dính phải bất kì bê bối nào, do đó họ yêu cầu người dùng nhập những mật khẩu tử tế, bất kể chúng có rườm rà thế nào. Hãy ghi nhớ kĩ thuật này vào lần tới khi bạn tạo một mật khẩu. Hãy tạo một mật khẩu khó phá đối với máy tính nhưng dễ nhớ đối với bạn – chứ không phải ngược lại.
Nhưng nếu bạn không muốn làm theo cách này, thì ít nhất hãy hứa với tôi rằng bạn sẽ tránh mọi biến thể của những xâu như 123456, password123, và qwerty. Chúng thực sự yếu lắm.
Chà, tôi nghĩ đó chính là lí do tại sao những người như chúng tôi lại bắt bạn phải nhập những thứ như jK8v!ge4D đấy.
————————————
Why jK8v!ge4D isn’t a good password by Jacob Bergdahl in @TDataScience https://towardsdatascience.com/why-password-validation-is-garbage-56e0d766c12e?source=social.tw