Một khái niệm trong phát triển ứng dụng thường bị bỏ qua và hiểu nhầm là khái niệm có liên quan tới việc sử dụng hàm băm (hashing) để bảo vệ mật khẩu. Chúng ta đã đi từ việc lưu trữ mật khẩu dưới dạng văn bản đơn thuần tới việc băm mật khẩu, tới việc kết hợp salt với mật khẩu và hiện nay phương pháp này thậm chí còn được coi là chưa đủ tính bảo mật. Trong bài viết này tôi sẽ bàn về định nghĩa băm, salt và pepper cũng như các thuật toán nên và không nên sử dụng.

Hàm băm – Hashing

Hàm băm là một loại thuật toán sử dụng dữ liệu có độ dài tùy ý và biến nó thành một chuỗi ký tự có độ dài cố định. Hàm này thường được sử dụng nhằm đơn giản hóa việc truy hồi dữ liệu vì nó cho phép rút ngắn một hàm lượng dữ liệu lớn thành một chuỗi ngắn hơn (dễ so sánh hơn). Ví dụ, chẳng hạn bạn có mẫu ADN của một người, chuỗi này bao gồm một lượng dữ liệu lớn (khoảng 2,2 – 3,5 MB), và bạn muốn tìm ra mẫu ADN này là của người nào. Bạn có thể lấy tất cả các mẫu và so sánh 2,2 MB dữ liệu với tất cả các mẫu ADN trong cơ sở dữ liệu, nhưng công việc này sẽ rất tốn thời gian, nhất là khi bạn phải nghiên cứu kỹ lưỡng hàng ngàn mẫu. Trong trường hợp này hàm băm sẽ rất hữu dụng, thay vì so sánh toàn bộ dữ liệu, bạn chỉ cần tính chuỗi băm của tập dữ liệu này (trong thực tế, một vài chuỗi băm sẽ được tính toán tại những vị trí khác nhau trên các nhiễm sắc thể, nhưng trong ví dụ này chúng ta giả sử đây là một chuỗi băm), từ đó ta sẽ có được một chuỗi giá trị cố định có độ dài, ví dụ như, 128 bits. Việc truy vấn 128-bits trong một cơ sở dữ liệu sẽ dễ dàng hơn và nhanh chóng hơn so với việc truy vấn 2,2 MB dữ liệu.

Điểm khác biệt chính giữa hàm băm và mã hóa (encryption), đó là hàm băm là hàm một chiều, từ giá trị băm khó có thể suy ngược lại độ dài hay nội dung của thông điệp gốc. Khi nói tới hàm băm mật mã, chúng ta đang nói đến những hàm băm có các đặc tính sau:

  • Giá trị băm của bất kỳ thông điệp nào đều có thể được tính toán một cách dễ dàng.
  • Không thể suy ra thông điệp gốc của giá trị băm.
  • Không thể thay đổi một thông điệp nếu không thay đổi giá trị băm.
  • Không tồn tại hai thông điệp khác nhau có giá trị băm như nhau.

Hàm băm phải có khả năng chống cự trước các tấn công mật mã, tức là phải có các đặc tính kháng cự sau:

  • Kháng xung đột (hai thông điệp khác nhau có giá trị băm như nhau)
  • Kháng tiền ảnh: với một mã băm h bất kỳ, khó tìm được một thông điệp m nào sao cho h = hash(m).
  • Kháng tiền ảnh thứ hai: với một thông điệp m bất kỳ, khó tìm được một thông điệp m’ sao cho m’ khác m và MD-5(m) = MD-5(m’).

Các thuật toán băm hiện đại

Một số thuật toán băm thường gặp:

  • MD-5
  • SHA-1
  • SHA-2
  • SHA-3

MD-5

MD-5 là một thuật toán băm vẫn còn được sử dụng rộng rãi nhưng đã được phát hiện có lỗi bảo mật do thuật toán này có nguy cơ mắc lỗi xung đột. MD-5 bị phá giải là do lỗi xung đột, không phải do lỗi tiền ảnh hay tiền ảnh thứ hai. Cuộc tấn công đầu tiên vào MD-5 được công bố năm 1996, trên thực tế đây là cuộc tấn công vào hàm nén MD-5 chứ không phải toàn bộ hàm băm MD-5. Năm 2004, một cuộc tấn công trên lý thuyết đã được triển khai và đã làm suy yếu tính chất kháng tiền ảnh của MD-5. Trên thực tế lần tấn công này không đủ nhanh để có thể phá giải được MD-5.

SHA

SHA hay thuật toán băm bảo mật (Secure Hashing Algorithm) là một họ những thuật toán băm mật mã do Viện Tiêu chuẩn và Công nghệ Quốc gia (NIST) công bố thuộc Tiêu chuẩn Xử lý Thông tin Liên bang Hoa Kỳ (FIPS). Hiện tại có ba thuật toán đã được định nghĩa:

  • SHA-1: Hàm băm có chiều dài 160-bit tương tự thuật toán MD-5 trước đó. Hàm này do Cơ quan An ninh Quốc gia Hoa Kỳ (NSA) thiết kế nhằm trở thành một bộ phận của Giải thuật ký số. SHA-1 đã bị phát hiện có chứa điểm yếu mật mã, do đó tiêu chuẩn này đã không còn được sử dụng cho đa số mục đích mã hóa kể từ sau năm 2010.
  • SHA-2: Là một họ hai hàm băm tương tự, với kích thước khối (block size) khác nhau, có tên là SHA-256 và SHA-512. Các hàm băm này khác nhau về word size; SHA-256 sử dụng 32-bit words còn SHA-512 sử dụng 64-bit words. Mỗi hàm băm còn có phiên bản rút gọn được chuẩn hóa, có tên là SHA-224 và SHA-384. Các hàm này đều do NSA thiết kế.
  • SHA-3: SHA-3 vẫn chưa được định nghĩa. NIST đang tiếp tục nghiên cứu những tham số chính xác sẽ được sử dụng; SHA-3 sẽ là Keccak, hay “gần giống như vậy”, nhưng không nhất thiết là phiên bản Keccak đã được đệ trình (đó là một chức năng có thể định hình được, và dường như NIST muốn chỉnh sửa các tham số khác đi một chút so với đề xuất ban đầu).

Lưu ý rằng cho dù SHA-1 đã bị “phá vỡ về chức năng mã hóa”, các đặc tính mà chúng ta tìm kiếm trong một thuật toán băm mật khẩu vẫn còn hiệu lực. Trên thực tế việc tìm kiếm một thuật toán băm mật khẩu được xây dựng dựa trên nền tảng SHA-1 vẫn có tính bảo mật, hiểu theo nghĩa là nếu như mật khẩu này được sử dụng thì không có lý do gì để cho rằng nó sẽ bị thay đổi ngay lập tức bởi một mật khẩu mới hơn.

Mật khẩu mạnh – Strong password

Ngoài việc chọn thuật toán băm tốt, bạn cũng nên bắt buộc người dùng chọn mật khẩu bao gồm ít nhất 8 ký tự ngẫu nhiên. Đáng tiếc là con người không giỏi ghi nhớ và tạo ra các chuỗi ký tự ngẫu nhiên. Đó là lý do vì sao chúng ta bắt buộc người dùng phải sử dụng mật khẩu gồm có số, chữ cái, ký hiệu và ít nhất một chữ cái in hoa. Nhưng điều này có ích gì cho quá trình sử dụng hàm băm để bảo vệ mật khẩu?

Các chiến lược sau được sử dụng để tấn công mật khẩu được bảo vệ bởi hàm băm:

  • Dictionary Attacks
  • Bruteforce
  • Rainbow Tables (tạo ra sẵn các mật khẩu mã hóa trong một cơ sở dữ liệu và tiến hành tìm kiếm cho mỗi giá trị băm)

Khi sử dụng phương thức tấn công dictionary attack, bạn sẽ cố gắng sử dụng các danh sách từ, trong đó bao gồm những mật khẩu, từ, tên, năm, vân vân được sử dụng phổ biến nhất. Chạy thuật toán băm đối với mỗi từ để xem giá trị băm kết quả có giống với giá trị băm trong cơ sở dữ liệu hay không. Nếu giống từ gốc của hàm băm chính là mật khẩu.

Với phương thức tấn công bruteforce attack bạn sẽ thử tất cả các tổ hợp ký tự có thể được. Khi sử dụng mật mã có độ dài ít nhất 8 ký tự, chỉ sử dụng bộ ký tự ASCII, ta có 128^8 khả năng mật khẩu.

Để thấy rõ tầm quan trọng của độ dài của mật khẩu:

Ngày nay, chỉ với một GPU hiện đại, bạn có thể xử lý 10.323.000.000 mật khẩu mỗi giây khi tấn công bruteforce MD-5 đơn thuần. Với tốc độ này, nếu sử dụng mật khẩu có độ dài 8 ký tự, sẽ mất khoảng 80 ngày để tạo ra từng khả năng một. Riêng GPU này có giá khoảng 500 đô la Mỹ (AMD Radeon 6990). Người ta đã tạo ra những bộ máy chứa 25 GPU như vậy trên thực tế, tối ưu hóa nó và tạo ra được 350 tỷ mật khẩu mỗi giây. Điều này đồng nghĩa với việc họ có thể tạo ra toàn bộ mật khẩu có khả năng từ 8 ký tự ngẫu nhiên trong vòng chưa đầy 2 ngày.

Nếu thêm một ký tự nữa vào mật khẩu, khả năng sẽ được tăng lên 128^9. Theo tính toán bên trên với tốc độ 350 tỷ mật khẩu mỗi giây thì sẽ mất 305 ngày. 10 ký tự -> 106 năm. Thời gian này có vẻ dài, nhưng chúng ta cũng cần cân nhắc định luật Moore:

Định luật Moore là kết quả của quan sát thấy, trong lịch sử phát triển của phần cứng máy tính, số lượng transistor trên vi mạch tích hợp sẽ tăng lên gấp đôi sau khoảng mỗi 2 năm. Khoảng thời gian này thường được phát biểu thành “18 tháng” là do Giám đốc Intel – ông David House, đã dự đoán hiệu suất của chip sẽ tăng gấp đôi trong khoảng thời gian đó (do ảnh hưởng kết hợp giữa việc số lượng transistor tăng lên và mỗi transistor có tốc độ nhanh hơn).

Chúng ta cũng cần lưu ý một thực tế là tốc độ máy tính đang ngày càng được cải thiện. Từ quan điểm mật mã, 106 năm vẫn là một khoảng thời gian ngắn. Chúng ta cần đạt tới thời gian vô tận (có nghĩa là sẽ mất từ vài trăm ngàn năm cho đến hàng triệu năm).

hasing password

 

Sử dụng hàm băm để bảo vệ mật khẩu

Tại sao chúng ta cần băm mật khẩu?

Chúng ta băm mật khẩu để đề phòng khả năng tin tặc tiếp cận và đọc được cơ sở dữ liệu, và chúng ta không muốn tin tặc khôi phục được văn bản gốc của mật khẩu. Lưu ý rằng thường thì chúng ta lưu trữ tên truy cập, địa chỉ email và các thông tin cá nhân khác trong cơ sở dữ liệu. Quy tắc bảo mật số 1 là người dùng cần phải được bảo vệ khỏi chính bản thân họ. Chúng ta có thể cảnh báo cho người dùng về các nguy cơ, có thể khuyên họ không tái sử dụng mật khẩu, nhưng chúng ta đều biết rằng rốt cuộc vẫn sẽ có những người sử dụng cùng một mật khẩu cho tài khoản Facebook, Gmail, Linkedin và cả mail doanh nghiệp. Điều mà bạn không mong muốn là khi tin tặc tiếp cận được cơ sở dữ liệu của bạn và lập tức truy cập được toàn bộ các tài khoản trên (tên truy cập/địa chỉ email giống nhau).

Việc sử dụng hàm băm để bảo vệ mật khẩu là nhằm ngăn tình huống này xảy ra, khi tin tặc tiếp cận được cơ sở dữ liệu của bạn, bạn muốn hắn ta phải tốn nhiều công sức nhất có thể để khôi phục được các mật khẩu trong đó sử dụng phương thức tấn công brute-force attack. Băm mật khẩu không giúp trang web của bạn an toàn hơn, nhưng nó sẽ thực hiện chức năng ngăn chặn tổn thất trong trường hợp bị xâm nhập trái phép.

Các đặc tính

Lúc này bạn đã nắm được tổng quan sơ bộ về các thuật toán băm, chúng ta sẽ cùng tìm hiểu sâu hơn về việc sử dụng hàm băm để bảo vệ mật khẩu. Việc băm mật khẩu đòi hỏi phải có các đặc tính sau:

  • Sử dụng chuỗi salt độc nhất cho mỗi mật khẩu (salt có thể chỉ được sử dụng một lần trong toàn bộ cơ sở dữ liệu chứa tất cả các chuỗi băm mật khẩu) nhằm ngăn chặn nỗ lực tấn công vào toàn bộ các chuỗi băm mật khẩu chỉ trong một lượt dò
  • Chạy nhanh trên phần mềm (thực hiện những tác vụ một lần với tốc độ nhanh tương đối)
  • Chạy chậm trên phần cứng (thực hiện những tác vụ đồng quy chậm hơn, nhằm ngăn ngừa tấn công brute force lên hệ thống phân bố)

Salt và Pepper

Salt là một giá trị độc nhất, không bí mật trong cơ sở dữ liệu (tùy theo thuật toán được sử dụng) được gắn vào mật khẩu trước khi mật khẩu được băm. Lưu ý rằng yêu cầu duy nhất đối với một salt là nó phải là độc nhất trong cơ sở dữ liệu, đồng nghĩa với việc tạo ngẫu nhiên không nhất thiết phải ngẫu nhiên về mặt mật mã. Salt được dùng để ngăn chặn phương thức dò tìm mật khẩu sử dụng Rainbow Table (phương thức tấn công sử dụng bảng tổng hợp các chuỗi băm để dò tìm mật khẩu).

Cần lưu ý rằng bạn không bao giờ được phép sử dụng bất kỳ thông tin nào được cung cấp sẵn để làm salt. Quy tắc này nhằm ngăn chặn hai cơ sở dữ liệu (của một ứng dụng khác chẳng hạn) trả lại cùng một kết quả băm giống nhau cho một chuỗi mật khẩu + salt bất kỳ. Đồng thời khi tấn công bruteforce, bạn không thể tạo ra tất cả các khả năng trong một lần chạy, mà sẽ phải chạy bruteforce cho từng mật khẩu kèm theo salt. Điều này nghĩa là bạn sẽ không thể phá toàn bộ mật khẩu trong vòng 2 ngày (như đoạn văn bên trên đề cập), mà sẽ cần phải chạy quy trình bruteforce cho từng mật khẩu kèm theo cả salt cụ thể của mật khẩu đó. Do đó việc dò mỗi giá trị băm sẽ mất 2 ngày thay vì chỉ mất 2 ngày cho toàn bộ cơ sở dữ liệu. Salt cũng giúp vô hiệu hóa việc sử dụng Rainbow Tables, do bảng này cần được tạo, cho từng mật khẩu, dựa trên salt. Đây là lý do vì sao salt lại quan trọng đến thế và vì sao phải sử dụng salt độc nhất cho mỗi cơ sở dữ liệu!

Pepper là một giá trị bí mật (một chìa khóa) được sử dụng để biến giá trị băm thành một HMAC (Pepper không nhất thiết đồng nghĩa với HMAC. Pepper được mô tả chính xác nhất là một khóa bí mật biến hàm băm thành một MAC. Có nhiều cách để tạo MAC; trong số đó HMAC là một phương pháp tốt). Một HMAC cũng giống như một hàm băm, nhưng không thể được sao chép nếu không có khóa bí mật. Đặc điểm này có thể gia tăng tính bảo mật nếu tin tặc chỉ có thể tiếp cận cơ sở dữ liệu chứ không tiếp cận được nơi lưu trữ khóa. Vấn đề là một khi dữ liệu bị xâm nhập trái phép, tin tặc thường ít nhất là tiếp cận được ổ cứng và trong một số trường hợp còn tiếp cận được cả bộ nhớ. Nếu tin tặc lấy được khóa, pepper không có tác dụng tăng tính bảo mật đối với thuật toán băm.

Tốc độ

Một thuật toán băm mật khẩu nên ngăn chặn những nỗ lực tấn công bruteforce một cách từ từ, và tốt nhất là nên có những đặc điểm thực sự làm giảm khả năng tấn công bruteforce phân bố vào các chuỗi băm. Ngay lập tức chúng ta liên hệ đến những thuật toán băm sau:

  • MD-5
  • SHA-1
  • SHA-2
  • SHA-3

Thực tế, ở dạng bình thường, tất cả các thuật toán nêu trên đều không phù hợp với việc băm mật khẩu. Chúng đều nhanh quá mức cần thiết. Người ta thường nghĩ rằng MD-5 không phù hợp với việc băm mật khẩu do bị tấn công xung đột, nhưng điều này không hoàn toàn chính xác, mà lý do là bởi nó là một thuật toán băm quá nhanh. SHA-3 cũng tương tự. Tôi đã từng quan sát mọi người dùng SHA-3 vào mục đích băm mật khẩu. Họ cho rằng vì thuật toán áp dụng theo tiêu chuẩn mới nên tất nhiên nó sẽ phù hợp với việc băm mật khẩu. Tuy nhiên, Keccak (tên thuật toán), theo thiết kế là một thuật toán băm nhanh. Điều này nghĩa là nó hoàn toàn không phù hợp cho việc băm mật khẩu dưới bất kỳ dạng nào. Vì vậy chúng ta nên lưu ý rằng không phải tất cả các thuật toán băm đều phù hợp với mục đích băm mật khẩu.

Chúng ta cũng có thể bổ sung:

  • MD-5, SHA-1, SHA-256 (và SHA-224) sử dụng phép toán 32-bit, chạy nhanh trên CPU x86 và cả ARM và, đặc biệt là, trên GPU như phiên bản hiện tại.
  • SHA-512 (và SHA-384) sử dụng các phép toán số học 64-bit
  • SHA-3 (Keccak) chỉ sử dụng phép toán luận lý (boolean operations), khiến cho nó có khả năng chạy nhanh trên mọi môi trường và chạy cũng khá nhanh trên FPGA (không có carry propagation).

Vậy chúng ta nên làm gì bây giờ? Thực ra bạn vẫn còn một số lựa chọn nếu nuốn sử dụng các chuỗi băm từ bộ thuật toán băm bảo mật. Nhưng chúng cần được sử dụng trong ứng dụng PBKDF2 (và cho dù như vậy không phải tất cả thuật toán trong số này đều phù hợp). Chúng ta sẽ thảo luận vấn đề này bên dưới.

Mật khẩu băm: các thuật toán

Hiện nay có ba thuật toán có thể sử dụng được một cách an toàn:

  • PBKDF2
  • bcrypt
  • scrypt

PBKDF2

PBKDF2 là một thuật toán được sử dụng để tạo ra các khóa. Thuật toán này không được tạo ra nhằm mục đích băm mật khẩu, nhưng nhờ có đặc tính chậm, nó trở nên khá phù hợp với chức năng này. Khóa kết quả được tạo ra (HMAC) có thể được dùng để lưu trữ mật khẩu một cách an toàn. PBKDF2 không phải là hàm lý tưởng cho việc băm mật khẩu, nhưng bù lại nó rất dễ sử dụng và được xây dựng trên thuật toán băm SHA-1 hoặc SHA-2 (HMAC nào cũng có thể sử dụng được, nhưng đây là những khóa phổ biến nhất và có tính bảo mật cao nhất). Đợi đã, không phải bạn vừa nói là SHA-1 và SHA-2 không phải là những thuật toán băm mật khẩu tốt hay sao? Đúng vậy, đó cũng là lý do vì sao chúng ta sử dụng PBKDF2 để làm cho quá trình băm chậm lại đáng kể. Bạn vẫn cần phải chọn thuật toán băm một cách cẩn thận, PBKDF2+Keccak là một lựa chọn tồi hơn nhiều so với PBKDF2+SHA-256, và thuật toán này lại không tốt bằng PBKDF2+SHA-512 nếu máy chủ của bạn là PC 64-bit.

Để tạo khóa PBKDF2 ta làm như sau:

DK = PBKDF2(PRF, Password, Salt, c, dkLen)

Trong đó DK là khóa được tạo, PRF là hàm HMAC được ưu tiên (đây có thể là HMAC SHA-1/2, password được sử dụng như một khóa cho HMAC còn salt được sử dụng như văn bản), c là số vòng lặp và dkLen là độ dài của khóa được tạo. Theo định nghĩa tiêu chuẩn, một salt phải có độ dài ít nhất 64 bits và số vòng lặp tối thiểu phải là 1024. Thuật toán sẽ tính toán SHA-1-HMAC(password+salt), và lặp lại phép tính 1024 lần trên kết quả thu được. Điều này có nghĩa là quá trình băm một mật khẩu sẽ chậm lại 1024 lần. Tuy nhiên điều này không thực sự bảo vệ mật khẩu tốt hơn trước nỗ lực tấn công bruteforce vào hệ thống phân bố hoặc GPU (Graphic Processing Unit).

Cũng có một dấu hiệu cảnh báo khi mật khẩu dài hơn 64 bytes, khi đó nó sẽ được cắt ngắn bằng cách thực hiện băm mật khẩu sử dụng thuật toán PBKDF2 sao cho độ dài mật khẩu không vượt quá block size. Ví dụ khi sử dụng HMAC-SHA-1 một mật khẩu dài hơn 64 bytes sẽ được giảm xuống SHA-1(password), có độ dài 20 bytes. Điều này có nghĩa là mật khẩu có độ dài lớn hơn 64 bytes không có tính bảo mật cao hơn trước những cuộc tấn công phá vỡ khóa được dùng để tạo ra HMAC, thậm chí còn làm giảm tính bảo mật vì độ dài của khóa sẽ bị giảm xuống (lưu ý rằng ngay cả khi giảm còn 20 bytes, cháu của cháu của cháu của cháu của cháu của cháu của cháu của cháu của cháu của cháu của cháu của chúng ta cũng đã ngỏm từ lâu trước khi khóa bị phá bởi phương thức brute force).

bcrypt

bcrypt hiện đang là tiêu chuẩn bảo mật không chính thức cho việc băm mật khẩu. Nó xuất phát từ mật mã khối Blowfish, sử dụng bảng tra cứu từ bộ nhớ để tạo ra giá trị băm. Điều này đồng nghĩa với việc phải sử dụng một số dung lượng bộ nhớ nhất định để tạo ra giá trị băm. Việc này có thể được thực hiện trên CPU, nhưng sẽ trở nên cồng kềnh hơn nhiều khi sử dụng GPU do hạn chế về bộ nhớ. Bcrypt đã ra đời được 14 năm, dựa trên một mật mã có tuổi đời hơn 20 năm. Nó đã được xem xét và thử nghiệm kỹ càng và nhờ đó được coi như tiêu chuẩn cho việc băm mật khẩu.

Thực ra vẫn có một điểm yếu, đó là đơn vị xử lý FPGA. Khi bcrypt bắt đầu được phát triển, mối đe dọa chủ yếu của nó là ASICs chuyên biệt được xây dựng nhằm mục đích chuyên tấn công các hàm băm. Ngày nay những ASICs đó sẽ là GPUs (phương thức tấn công bruteforce trên thực tế vẫn có thể chạy trên GPU, nhưng không hoàn toàn song song) có giá bán vừa túi tiền và lý tưởng đối với những quá trình đa luồng nhưng tấn công bruteforce.

FPGAs (Field Programmable Gate Arrays) cũng tương tự như GPUs nhưng việc quản lý bộ nhớ lại rất khác. Bruteforcing bcrypt có thể được thực hiện hiệu quả hơn trên những chip này so với trên GPUs, nhưng nếu mật khẩu dủ dài thì vẫn không thể bị phá bằng phương thức này.

scrypt

Đối với việc băm mật khẩu, xu hướng hiện nay là chuyển vấn đề sang một mức khác; tập trung vào một phép toán khó thực hiện trên các thiết bị trừ PC, ví dụ như truy cập bộ nhớ ngẫu nhiên, thay vì chạy hàng loạt hàm băm. Đó chính là nội dung của scrypt. Scrypt là một thuật toán băm khác có cùng đặc tính với bcrypt, trừ việc khi bạn tăng số vòng lên, thời gian tính toán và bộ nhớ cần thiết để tạo ra giá trị băm cũng sẽ tăng theo cấp số mũ. Scrypt được tạo ra trong bối cảnh các nỗ lực tấn công vào bcrypt ngày càng phát triển và việc sử dụng FPGAs hay GPUs đều không khả thi do hạn chế về bộ nhớ. Scrypt đòi hỏi việc lưu trữ một chuỗi “snapshots” dữ liệu trạng thái trung gian, được sử dụng trong những phép toán đạo hàm cao hơn. Những snapshots này được lưu trữ trong bộ nhớ và tăng trưởng theo cấp số mũ khi số vòng tăng lên. Do đó khi thêm một vòng, việc tấn công brute force vào mật khẩu sẽ khó khăn thêm gấp bội. Scrypt vẫn còn khá mới mẻ so với bcrypt và mới chỉ được đưa vào sử dụng được vài năm, do đó chưa được xem xét kỹ lưỡng như bcrypt.

Kết luận

Mật khẩu nên được băm bằng thuật toán PBKDF2, bcrypt hoặc scrypt, không bao giờ nên dùng MD-5 và SHA-3 để băm mật khẩu và SHA-1/2(password+salt) cũng không nên được sử dụng. Hiện nay thuật toán băm được xem xét kỹ lưỡng nhất và có tính bảo mật cao nhất là bcrypt. PBKDF2 cũng không tồi, nhưng bạn nên ưu tiên sử dụng bcrypt nếu có thể. Scrypt, tuy được coi là rất an toàn, lại khá mới mẻ và do đó chưa được khuyến khích sử dụng nhiều, nhưng dường như nó sẽ trở thành thuật toán tiếp bước bcrypt một khi được sử dụng lâu dài hơn. Lưu ý rằng cho dù có một số dấu hiệu cảnh bảo và chiến lược tấn công bruteforce vào mật khẩu băm sử dụng PBKDF2 và bcrypt, những thuật toán này vẫn được coi là không thể phá được đối với những mật khẩu mạnh (mật khẩu có độ dài hơn 8 ký tự, bao gồm chữ số, chữ cái, ký hiệu và ít nhất một chữ cái in hoa)

Theo Fsd14

Sử dụng hàm băm để bảo vệ mật khẩu (Hash Password)

Category: Uncategorized
0
17656 views

Join the discussion

Your email address will not be published. Required fields are marked *