Mạng lưu trữ mật khẩu và thông tin đăng nhập khác của bạn như thế nào?
Nhiều năm trước, mật khẩu ngẫu nhiên tám ký tự bao gồm chữ hoa và chữ thường, ký hiệu và số thực sự khó bẻ khóa. Trong một số trường hợp, một mật khẩu như vậy phải mất nhiều năm để bẻ khóa.
Nhờ công nghệ thay đổi ngày nay và máy móc có thể thuê, thời gian này đã giảm xuống còn hàng giờ. Nhưng những mật khẩu này được lưu trữ như thế nào?
Mục Lục
Mật khẩu được lưu trữ trực tuyến như thế nào
Các hệ thống không lưu trữ mật khẩu người dùng trực tiếp trong tệp hoặc cơ sở dữ liệu, vì những kẻ tấn công có thể chiếm lấy cơ sở dữ liệu nơi hệ thống lưu giữ mật khẩu. Thay vào đó, các hệ thống mã hóa mật khẩu của người dùng và những kẻ tấn công gặp phải một phiên bản được mã hóa của mỗi mật khẩu.
Có một số thuật toán mà các hệ thống sử dụng để mã hóa mật khẩu. Một trong những thuật toán này là thuật toán đối xứng. Thuật toán đối xứng là một loại mã hóa mà bạn có thể sử dụng cùng một khóa cho cả mã hóa và giải mã. Khóa bạn sẽ sử dụng để mã hóa dữ liệu giống nhau cho cả mã hóa và giải mã. Tính bảo mật của các thuật toán đối xứng mang một số rủi ro vì chỉ có một khóa để giải mã. Vì lý do này, các hệ thống thường không sử dụng thuật toán đối xứng để mã hóa mật khẩu.
Nói chung, phương pháp mà các hệ thống sử dụng để mã hóa là thuật toán băm. Các thuật toán băm là để xác minh và thể hiện tính toàn vẹn của dữ liệu, không phải để mã hóa dữ liệu. Thuật toán băm chuyển đổi dữ liệu thành hàm băm có kích thước cố định. Các giá trị băm này thường đại diện cho một giá trị băm duy nhất của dữ liệu.
Nhờ thuật toán băm, nếu kẻ tấn công đã chiếm lấy cơ sở dữ liệu mật khẩu, kẻ tấn công không thể truy cập ngược mật khẩu từ đây. Có một sắc thái rất quan trọng mà bạn nên chú ý ở đây. Về mặt lý thuyết, kẻ tấn công thỏa hiệp một hệ thống sử dụng cùng một thuật toán băm cho tất cả các kết hợp mật khẩu có thể so sánh kết quả thu được. Nếu kẻ tấn công tạo ra cùng một giá trị do kết quả của những so sánh này, thì kẻ tấn công đã tìm ra phiên bản mở của mật khẩu là gì. Phương pháp này hoàn toàn là thử và sai, và hình thức tấn công này thường được gọi là tấn công vũ phu.
Vào đầu những năm 2000, có thể mất hàng trăm năm để thử tất cả các kết hợp cho mật khẩu 8 ký tự được mã hóa bằng các thuật toán băm phổ biến. Tất nhiên, điều này không bao gồm các kết hợp rất đơn giản như “123456” hoặc “mypassword” trong tập hợp này. Với sự phát triển của công nghệ phần mềm và phần cứng ngày nay, phương pháp bẻ khóa mật khẩu cũng có nhiều thay đổi.
Tác động của GPU mới nổi
Khả năng xử lý dữ liệu song song của bộ xử lý đồ họa (GPU) đã được cải thiện theo thời gian. GPU không có khả năng thực hiện các hoạt động linh hoạt như CPU đa năng. Vì vậy, mặc dù có rất nhiều lõi và sức mạnh xử lý song song, nhưng sẽ không có ý nghĩa gì khi sử dụng chúng cho hầu hết mọi vấn đề như CPU.
Tuy nhiên, có thể thực hiện một số thuật toán băm được sử dụng cho mật khẩu khá hiệu quả trên GPU. Giá trị băm có thể tính toán mỗi giây mà bạn có thể đạt được với CPU truyền thống đã tăng lên rất nhiều với các nền tảng GPU mới.
Để có ý tưởng, hãy kiểm tra số lượng băm mỗi giây của các thuật toán băm như NTLM, MD5 và SHA1 trong bảng bên dưới. Hiện tại, đủ để biết rằng các thuật toán này chỉ là một thuật toán băm. Để tạo bảng này, tôi đã sử dụng một hệ thống cụm bao gồm 25 GPU AMD Radeon.
thuật toán |
Băm mỗi giây |
NTLM |
350.000.000.000 |
MD5 |
180.000.000.000 |
SHA1 |
63.000.000.000 |
SHA512Mật mã |
364.000 |
Bcrypt |
71.000 |
mã hóa |
33.000 |
Như bạn có thể thấy, với một hệ thống như vậy, bạn có thể tạo các hàm băm NTLM 350 tỷ lần mỗi giây. Điều này có nghĩa là bạn có thể thử tất cả các kết hợp mật khẩu 8 ký tự trong vòng chưa đầy 6 giờ. Hơn nữa, phần cứng trong ví dụ này thuộc về nhiều năm trước. Hãy tưởng tượng sức mạnh bẻ khóa mật khẩu ngày nay.
Nhà phát triển phần mềm nên làm gì?
Con đường mà các lập trình viên nên làm khá đơn giản: họ nên ưu tiên các thuật toán mất nhiều thời gian hơn để tính toán các giá trị băm khi mã hóa mật khẩu. Các nhà phát triển không chỉ cần tìm hiểu về hiệu suất của thuật toán mà họ đang sử dụng trên CPU mà còn về khả năng phục hồi của nó trước thế giới GPU.
Nếu các nhà phát triển đang làm việc với một khung phần mềm cũng giải quyết các quy trình mã hóa mật khẩu như Django, Ruby on Rails và Spring Security, thì họ nên kiểm tra xem các quyết định đúng đắn đã được đưa ra trong khung về mặt bảo mật hay chưa.
Ví dụ: Devise, một trong những thư viện được sử dụng nhiều nhất cho hoạt động của người dùng trong Ruby on Rails, sử dụng Bcrypt làm thuật toán băm mặc định. Nó cũng cho phép bạn sử dụng một phương pháp khác là thuật toán băm. Thuật toán Bcrypt đáng tin cậy vì GPU vẫn mất một thời gian rất dài để phá vỡ.
Tóm lại, thời gian tính toán giá trị băm càng lâu thì bạn càng an toàn.
Mật khẩu của bạn nên có bao nhiêu ký tự?
Mỗi ký tự bổ sung mà bạn sử dụng sẽ tăng về mặt hình học số lần thử và lỗi cần thiết để bẻ khóa mật khẩu của bạn và làm cho mật khẩu của bạn an toàn hơn.
Hãy xem xét tình huống này thông qua hai kịch bản khác nhau. Hãy xem xét các giá trị trong bảng trên cho thuật toán băm NTLM và tưởng tượng rằng bạn sẽ cố bẻ khóa mật khẩu. Hãy tưởng tượng nhắm mục tiêu mật khẩu từ tám ký tự trở lên.
Số ký tự |
Chữ hoa/chữ thường và số |
Chữ hoa/thường, số và ký hiệu đặc biệt |
số 8 |
chưa tới 1 phút |
2 phút |
9 |
2 phút |
2 giờ |
10 |
2 giờ |
1 tuần |
11 |
6 ngày |
2 năm |
12 |
1 năm |
200 năm |
13 |
hơn 100 năm |
hơn 1000 năm |
Khi kiểm tra bảng, bạn có thể thấy rằng việc sử dụng mật khẩu tối thiểu 12 ký tự sẽ an toàn khi bạn sử dụng tất cả các kết hợp chữ hoa/chữ thường, số và ký hiệu đặc biệt. Nếu bạn không sử dụng các ký hiệu đặc biệt thì hóa ra bạn cần sử dụng 13 ký tự làm độ dài mật khẩu an toàn. Nếu bạn đã sử dụng phương pháp băm Bcrypt thay vì băm NTLM trong hệ thống này, thì 8 ký tự là đủ. Tuy nhiên, bạn không có cơ hội để biết hệ thống bạn nhập trên web sử dụng phương pháp băm nào để giữ mật khẩu của bạn. Đó là lý do tại sao bạn nên xem xét tất cả các khả năng.
Vấn đề chính đối với các nhà phát triển phần mềm là gần như không thể thuyết phục người dùng có mật khẩu tối thiểu 12 ký tự. Ngày nay, có thể nói rằng tỷ lệ sử dụng mật khẩu có độ dài này là thấp. Do đó, theo kịch bản sử dụng của hệ thống đã phát triển, sẽ cần phải tìm một nền tảng trung gian sẽ được người dùng chấp nhận để cải thiện bảo mật mật khẩu của họ.
gợi ý cuối cùng cho các nhà phát triển là kiểm tra không chỉ độ dài tối thiểu mà còn cả độ dài tối đa của thông tin đầu vào thông qua các biểu mẫu mà bạn đã trình bày cho người dùng. Đặc biệt khi bạn kích hoạt sử dụng thuật toán băm tính toán chậm như Bcrypt cho mục đích bảo mật, bạn có thể gặp phải một số rủi ro nếu không kiểm soát độ dài tối đa của mật khẩu mà người dùng nhập vào. Ví dụ, kẻ tấn công có thể thực hiện tấn công bằng cách thử hàng chục mật khẩu 100 nghìn ký tự cùng lúc với một số yêu cầu được chuẩn bị đặc biệt. Trong trường hợp như vậy, rất có thể hệ thống của bạn sẽ không phản hồi đối với những người dùng khác.
Lời khuyên cho người dùng cuối
Đặt độ dài mật khẩu của bạn tối thiểu là 12 ký tự và đảm bảo bao gồm các tổ hợp chữ hoa và chữ thường, số và ký hiệu. Đừng bao giờ quên rằng các hệ thống lưu trữ mật khẩu của bạn có thể bị tấn công và thông tin của bạn có thể bị lạm dụng. Bạn không thể biết hệ thống sử dụng thuật toán nào để mã hóa mật khẩu của mình, do đó, bạn hoàn toàn có thể đề phòng và tạo mật khẩu mạnh.