Mật khẩu

Mật khẩu, đôi khi được gọi là mật mã, là một bí mật được ghi nhớ, thường là một chuỗi ký tự, được sử dụng để xác nhận danh tính của người dùng. Sử dụng thuật ngữ của Nguyên tắc nhận dạng kỹ thuật số NIST, bí mật được ghi nhớ bởi một bên gọi là "nguyên đơn" trong khi bên xác minh danh tính của nguyên đơn được gọi là người "xác minh". Khi nguyên đơn thể hiện thành công kiến thức về mật khẩu cho người xác minh thông qua giao thức xác thực được thiết lập, người xác minh có thể suy ra danh tính của nguyên đơn.

Nói chung, một mật khẩu là một chuỗi các ký tự tùy ý bao gồm chữ cái, chữ số, hoặc các biểu tượng khác. Nếu các ký tự cho phép bị ràng buộc là số, thì bí mật tương ứng đôi khi được gọi là số nhận dạng cá nhân (personal identification number - PIN).

Mật khẩu không cần phải là một từ thực tế; thật vậy, một từ không tồn tại (theo nghĩa từ điển) có thể khó đoán hơn, đó là một thuộc tính mong muốn của mật khẩu. Một bí mật ghi nhớ bao gồm một chuỗi các từ hoặc văn bản khác được phân tách bằng dấu cách đôi khi được gọi là cụm mật khẩu. Một cụm mật khẩu tương tự như mật khẩu trong cách sử dụng, nhưng cụm mật khẩu thường dài hơn để tăng cường bảo mật.

== Lịch sử ==
Mật khẩu đã được sử dụng từ thời cổ đại. Quân lính sẽ yêu cầu những người muốn vào một khu vực phải cung cấp mật khẩu hoặc "khẩu hiệu" và chỉ cho phép một người hoặc một nhóm vượt qua nếu họ biết mật khẩu. Polybius mô tả hệ thống phân phối khẩu hiệu trong quân đội La Mã như sau: Cách thức mà họ đảm bảo trao đổi các khẩu hiệu cho đêm là như sau: từ trung đội thứ mười của từng loại bộ binh và kỵ binh, các trung đội được đóng trại vào nửa cuối của đường phố, một người đàn ông được chọn không phải làm nhiệm vụ canh gác, và anh ta tham dự mỗi ngày vào lúc hoàng hôn tại lều của tribune, và nhận được một khẩu hiệu, đó là một chiếc bảng bằng gỗ có chữ khắc trên đó - sau đó anh ta rời đi, và trở về trại của anh ta, nói khẩu hiệu trên trước các nhân chứng cho chỉ huy của người kế tiếp, người này sẽ lần lượt chuyển nó cho người bên cạnh. Tất cả đều làm như vậy cho đến khi nó đạt đến các thao tác đầu tiên, những người bị có doanh trại gần lều của các bộ lạc. Những người sau này có nghĩa vụ giao bảng chứa mật khẩu cho các bộ lạc trước khi trời tối. Vì vậy, nếu tất cả những gì được ban hành được trả lại, bộ lạc biết rằng khẩu hiệu đã được trao cho tất cả các đơn vị quân, và đã chuyển qua tất cả trên đường trở về với anh ta. Nếu bất kỳ bảng mật khẩu trong số họ bị mất tích, anh ta sẽ điều tra ngay lập tức, vì anh ta biết được các dấu hiệu từ khu vực nào mà bảng mật khẩu không quay trở lại, và bất cứ ai chịu trách nhiệm cho việc giữ lại bảng mật khẩu đều phải chịu hình phạt mà anh ta đáng phải chịu. 

Mật khẩu trong sử dụng quân sự được phát triển để bao gồm không chỉ mật khẩu, mà cả mật khẩu và phản mật khẩu; ví dụ như trong những ngày khai mạc trận Normandy, lính dù của Airborne Division 101 Mỹ sử dụng một mật khẩu "flash" -mà được trình bày như là một thách thức, và cần được trả lời với từ "thunder". Thử thách và câu trả lời đúng được thay đổi ba ngày một lần. Lính nhảy dù Mỹ cũng nổi tiếng sử dụng một thiết bị được gọi là "cricket" trong D-Day thay cho hệ thống mật khẩu như một phương pháp nhận dạng tạm thời duy nhất; một lần nhấp bằng miếng kim loại được do thiết bị tạo ra, thay cho mật khẩu người đáp lại cần đáp ứng bằng hai lần nhấp để trả lời.

Mật khẩu đã được sử dụng với máy tính từ những ngày đầu tiên của máy tính. Hệ thống chia sẻ thời gian tương thích (CTSS), một hệ điều hành được giới thiệu tại MIT vào năm 1961, là hệ thống máy tính đầu tiên thực hiện đăng nhập mật khẩu. CTSS có lệnh LOGIN yêu cầu mật khẩu người dùng. "Sau khi nhập PASSWORD, hệ thống sẽ tắt cơ chế in, nếu có thể, để người dùng có thể nhập mật khẩu của mình với quyền riêng tư." Đầu những năm 1970, Robert Morris đã phát triển một hệ thống lưu trữ mật khẩu đăng nhập dưới dạng băm như một phần của hệ điều hành Unix. Hệ thống này dựa trên một máy mật mã cánh quạt Hagelin mô phỏng và lần đầu tiên xuất hiện trong phiên bản Unix phiên bản thứ 6 vào năm 1974. Một phiên bản sau của thuật toán của anh ta, được gọi là crypt(3), đã sử dụng salt 12 bit và gọi một dạng sửa đổi của thuật toán DES 25 lần để giảm nguy cơ tấn công từ điển được tính toán trước.

Trong thời hiện đại, tên người dùng và mật khẩu thường được mọi người sử dụng trong quá trình đăng nhập kiểm soát quyền truy cập vào hệ điều hành máy tính được bảo vệ, điện thoại di động, bộ giải mã truyền hình cáp, máy rút tiền tự động (ATM), v.v. Một người dùng máy tính thông thường có mật khẩu cho nhiều mục đích: đăng nhập vào tài khoản, truy xuất e-mail, truy cập ứng dụng, cơ sở dữ liệu, mạng, trang web và thậm chí đọc báo buổi sáng trực tuyến.

== Chọn một mật khẩu an toàn và dễ nhớ ==
Thông thường, mật khẩu dễ nhớ hơn đối với chủ sở hữu có nghĩa là kẻ tấn công sẽ dễ đoán hơn. Tuy nhiên, mật khẩu khó nhớ cũng có thể làm giảm tính bảo mật của hệ thống vì (a) người dùng có thể cần ghi lại hoặc lưu trữ mật khẩu điện tử, (b) người dùng sẽ cần đặt lại mật khẩu thường xuyên và (c) người dùng có nhiều khả năng sử dụng lại cùng một mật khẩu trên các tài khoản khác nhau. Tương tự, các yêu cầu mật khẩu càng nghiêm ngặt, chẳng hạn như "có sự pha trộn giữa chữ hoa và chữ thường và chữ số" hoặc "thay đổi hàng tháng", mức độ mà người dùng sẽ lật đổ hệ thống càng lớn. Những người khác tranh luận mật khẩu dài hơn cung cấp bảo mật hơn (ví dụ: entropy) so với mật khẩu ngắn hơn với nhiều loại ký tự.

Trong "Khả năng ghi nhớ và bảo mật của mật khẩu", Jeff Yan et al. kiểm tra hiệu quả của lời khuyên dành cho người dùng về một lựa chọn tốt về mật khẩu. Họ phát hiện ra rằng mật khẩu dựa trên suy nghĩ của một cụm từ và lấy chữ cái đầu tiên của mỗi từ cũng đáng nhớ như mật khẩu được chọn một cách ngây thơ và khó bị bẻ khóa như mật khẩu được tạo ngẫu nhiên.

Kết hợp hai hoặc nhiều từ không liên quan và thay đổi một số chữ cái thành ký tự hoặc số đặc biệt là một phương pháp tốt khác, nhưng một từ trong từ điển thì không. Có một thuật toán được thiết kế cá nhân để tạo mật khẩu tối nghĩa là một phương pháp tốt khác.

Tuy nhiên, yêu cầu người dùng nhớ mật khẩu bao gồm "kết hợp các ký tự viết hoa và viết thường" tương tự như yêu cầu họ nhớ một chuỗi bit: khó nhớ và chỉ khó hơn một chút để bẻ khóa (ví dụ khó hơn 128 lần bẻ khóa mật khẩu 7 chữ cái, ít hơn nếu người dùng chỉ cần viết hoa một trong các chữ cái). Yêu cầu người dùng sử dụng "cả chữ cái và chữ số" thường sẽ dẫn đến những sự thay thế dễ đoán như 'E' → '3' và 'I' → '1', những sự thay thế được biết đến với những kẻ tấn công. Tương tự gõ mật khẩu trên một một hàng bàn phím cao hơn để thay đổi chữ là một mẹo mật khẩu mà những kẻ tấn công cũng biết.

Vào năm 2013, Google đã công bố danh sách các loại mật khẩu phổ biến nhất, tất cả đều được coi là không an toàn vì chúng quá dễ đoán (đặc biệt là sau khi nghiên cứu một cá nhân trên phương tiện truyền thông xã hội):
- Tên của vật nuôi, trẻ em, thành viên gia đình hoặc quan trọng khác
- Ngày kỷ niệm và sinh nhật
- Nơi sinh
- Tên của một kỳ nghỉ yêu thích
- Một cái gì đó liên quan đến một đội thể thao yêu thích
- Từ "password", "mật khẩu"

== Các yếu tố trong bảo mật của hệ thống mật khẩu ==
Tính bảo mật của hệ thống được bảo vệ bằng mật khẩu phụ thuộc vào một số yếu tố. Hệ thống tổng thể phải được thiết kế để bảo mật tốt, với khả năng bảo vệ chống lại virus máy tính, các cuộc tấn công trung gian và tương tự. Các vấn đề an ninh vật lý cũng là một mối quan tâm, từ việc ngăn chặn việc lướt vai cho đến các mối đe dọa vật lý phức tạp hơn như máy quay video và người đánh hơi bàn phím. Mật khẩu nên được chọn sao cho kẻ tấn công khó đoán và kẻ tấn công khó phát hiện bằng cách sử dụng bất kỳ kế hoạch tấn công tự động có sẵn nào. Xem độ mạnh của mật khẩu và bảo mật máy tính để biết thêm thông tin.

Ngày nay, thông thường các hệ thống máy tính sẽ ẩn mật khẩu khi chúng được gõ. Mục đích của biện pháp này là để ngăn người ngoài đọc mật khẩu; tuy nhiên, một số ý kiến cho rằng cách làm này có thể dẫn đến sai lầm và căng thẳng, khuyến khích người dùng chọn mật khẩu yếu. Thay vào đó, người dùng nên có tùy chọn hiển thị hoặc ẩn mật khẩu khi họ nhập chúng.

Các điều khoản kiểm soát truy cập hiệu quả có thể buộc các biện pháp cực đoan đối với tội phạm tìm cách lấy mật khẩu hoặc mã thông báo sinh trắc học. Các biện pháp cực đoan hơn bao gồm tống tiền, phân tích ống cao su và tấn công kênh bên.

Một số vấn đề quản lý mật khẩu cụ thể dưới đây phải được xem xét khi suy nghĩ, lựa chọn và xử lý mật khẩu.

=== Tần suất kẻ tấn công có thể thử đoán mật khẩu ===
Tốc độ mà kẻ tấn công có thể gửi mật khẩu đoán cho hệ thống là yếu tố chính trong việc xác định bảo mật hệ thống. Một số hệ thống áp dụng thời gian chờ vài giây sau một số lượng nhỏ (ví dụ: ba) lần thử nhập mật khẩu không thành công. Trong trường hợp không có lỗ hổng khác, các hệ thống như vậy có thể được bảo mật hiệu quả với mật khẩu tương đối đơn giản, nếu chúng được lựa chọn tốt và không dễ đoán.

Nhiều hệ thống lưu trữ một mật mã băm của mật khẩu. Nếu kẻ tấn công có quyền truy cập vào tệp đoán mật khẩu băm có thể được thực hiện ngoại tuyến, hãy nhanh chóng kiểm tra mật khẩu ứng viên dựa trên giá trị băm của mật khẩu thật. Trong ví dụ về máy chủ web, kẻ tấn công trực tuyến chỉ có thể đoán ở tốc độ mà máy chủ sẽ phản hồi, trong khi kẻ tấn công ngoại tuyến (có quyền truy cập vào tệp) chỉ có thể đoán ở tốc độ giới hạn bởi phần cứng của máy đang tấn công.

Mật khẩu được sử dụng để tạo khóa mật mã (ví dụ: để mã hóa ổ đĩa hoặc bảo mật Wi-Fi) cũng có thể bị đoán với tốc độ cao. Danh sách các mật khẩu phổ biến có sẵn rộng rãi và có thể làm cho các cuộc tấn công mật khẩu rất hiệu quả. (Xem Bẻ khóa mật khẩu) Bảo mật trong các tình huống như vậy phụ thuộc vào việc sử dụng mật khẩu hoặc cụm mật khẩu có độ phức tạp đầy đủ, khiến cho một cuộc tấn công như vậy không thể tính toán được cho kẻ tấn công. Một số hệ thống, chẳng hạn như PGP và Wi-Fi WPA, áp dụng hàm băm chuyên sâu tính toán cho mật khẩu để làm chậm các cuộc tấn công như vậy. Xem kéo dài khóa.

=== Giới hạn về số lần đoán mật khẩu ===
Một cách khác để giới hạn tốc độ mà kẻ tấn công có thể đoán được mật khẩu là giới hạn tổng số lần đoán có thể được thực hiện. Mật khẩu có thể bị vô hiệu hóa, yêu cầu đặt lại, sau một số ít dự đoán sai liên tiếp (giả sử là 5); và người dùng có thể được yêu cầu phải thay đổi mật khẩu sau số lần đoán sai tích lũy lớn hơn (giả sử 30), để ngăn kẻ tấn công tạo ra một số lượng lớn các dự đoán sai tùy ý bằng cách xen kẽ chúng giữa các dự đoán tốt do chủ sở hữu mật khẩu hợp pháp đưa ra. Kẻ tấn công có thể sử dụng kiến thức về giảm thiểu này để thực hiện một cuộc tấn công từ chối dịch vụ chống lại người dùng bằng cách cố ý khóa người dùng khỏi thiết bị của họ; sự từ chối dịch vụ này có thể mở ra những con đường khác để kẻ tấn công thao túng tình hình thành lợi thế của chúng thông qua kỹ thuật xã hội.

=== Hình thức mật khẩu được lưu trữ ===
Một số hệ thống máy tính lưu trữ mật khẩu người dùng dưới dạng văn bản thô, dựa vào đó để so sánh các nỗ lực đăng nhập của người dùng. Nếu kẻ tấn công giành được quyền truy cập vào kho lưu trữ mật khẩu nội bộ như vậy, thì tất cả mật khẩu và tất cả các tài khoản người dùng sẽ bị xâm phạm. Nếu một số người dùng sử dụng cùng một mật khẩu cho các tài khoản trên các hệ thống khác nhau, những hệ thống đó cũng sẽ bị xâm phạm.

Các hệ thống an toàn hơn lưu trữ từng mật khẩu ở dạng được bảo vệ bằng mật mã, do đó, việc truy cập vào mật khẩu thực tế sẽ vẫn khó khăn đối với một kẻ rình mò có quyền truy cập nội bộ vào hệ thống, trong khi vẫn có thể xác thực các nỗ lực truy cập của người dùng. Các hệ thống an toàn nhất không lưu trữ mật khẩu, mà chỉ có dẫn xuất một chiều, chẳng hạn như đa thức, mô đun hoặc hàm băm nâng cao. Roger Needham đã phát minh ra cách tiếp cận phổ biến hiện nay là chỉ lưu trữ một dạng "băm" của mật khẩu văn bản gốc. Khi người dùng nhập mật khẩu trên một hệ thống như vậy, phần mềm xử lý mật khẩu sẽ chạy qua thuật toán băm mật mã và nếu giá trị băm được tạo từ mục nhập của người dùng khớp với hàm băm được lưu trữ trong cơ sở dữ liệu mật khẩu, người dùng được phép truy cập. Giá trị băm được tạo bằng cách áp dụng hàm băm mật mã cho một chuỗi bao gồm mật khẩu được gửi và, trong nhiều triển khai, một giá trị khác được gọi là muối (salt). Một giá trị muối ngăn chặn kẻ tấn công dễ dàng xây dựng một danh sách các giá trị băm cho mật khẩu phổ biến và ngăn chặn các nỗ lực bẻ khóa mật khẩu trên tất cả người dùng. MD5 và SHA1 là các hàm băm mật mã được sử dụng thường xuyên nhưng chúng không được khuyến nghị để băm mật khẩu trừ khi chúng được sử dụng như một phần của cấu trúc lớn hơn như trong PBKDF2.