Sự khác biệt giữa Băm mật khẩu và Mã hóa nó


140

Các bình chọn hàng đầu hiện nay cho câu hỏi này nêu:

Một vấn đề khác không phải là vấn đề bảo mật, mặc dù nó liên quan đến bảo mật, đã hoàn tất và loại bỏ thất bại để tìm ra sự khác biệt giữa việc băm mật khẩu và mã hóa nó . Thông thường nhất được tìm thấy trong mã nơi lập trình viên đang cố gắng cung cấp chức năng "Nhắc tôi về mật khẩu của tôi" không an toàn.

Chính xác thì sự khác biệt này là gì? Tôi luôn có ấn tượng rằng băm là một hình thức mã hóa. Các chức năng không an toàn mà poster được đề cập là gì?


Một bài viết được viết tốt về lý do tại sao bạn không nên đơn giản băm bí mật / mật khẩu của bạn. Thay vào đó hãy sử dụng HMAC. benlog.com/articles/2008/06/19/dont-hash-secrets
Jay Kumar

Tóm tắt tuyệt vời về chủ đề trên blog bảo mật StackExchange: security.blogoverflow.com/2011/11/
Kẻ

@JayKumar: Bài viết bạn liên kết rất sai lệch. Nó kết hợp các muối mật khẩu (dự kiến ​​sẽ hiển thị cho kẻ tấn công) bằng các khóa MAC (dự kiến ​​sẽ giữ bí mật). Liên kết của David J. Liszewski cung cấp một mô tả chính xác hơn nhiều.
Rufflewind

Câu trả lời:


222

Băm là một hàm một chiều (tốt, ánh xạ). Không thể đảo ngược, bạn áp dụng thuật toán băm an toàn và bạn không thể lấy lại chuỗi gốc. Điều tốt nhất bạn có thể làm là tạo ra cái gọi là "xung đột", nghĩa là tìm một chuỗi khác nhau cung cấp cùng một hàm băm. Các thuật toán băm bảo mật bằng mật mã được thiết kế để ngăn chặn sự xuất hiện của các va chạm. Bạn có thể tấn công băm an toàn bằng cách sử dụng bảng cầu vồng , bạn có thể chống lại bằng cách áp dụng muối vào hàm băm trước khi lưu trữ.

Mã hóa là một chức năng (hai cách) thích hợp. Nó có thể đảo ngược, bạn có thể giải mã chuỗi xéo để lấy chuỗi gốc nếu bạn có khóa.

Chức năng không an toàn mà nó đề cập đến là nếu bạn mã hóa mật khẩu, ứng dụng của bạn có khóa được lưu trữ ở đâu đó và kẻ tấn công có quyền truy cập vào cơ sở dữ liệu của bạn (và / hoặc mã) có thể lấy mật khẩu gốc bằng cách lấy cả khóa và văn bản được mã hóa , trong khi với một hàm băm thì không thể.

Mọi người thường nói rằng nếu một cracker sở hữu cơ sở dữ liệu của bạn hoặc mã của bạn thì anh ta không cần mật khẩu, do đó, sự khác biệt là không cần thiết. Điều này là ngây thơ, bởi vì bạn vẫn có nghĩa vụ bảo vệ mật khẩu của người dùng của mình, chủ yếu là vì hầu hết trong số họ sử dụng cùng một mật khẩu nhiều lần, khiến họ gặp rủi ro lớn hơn khi rò rỉ mật khẩu.


1
Để rõ ràng, có được bảo mật mong muốn với hàm băm, nó phải là thuật toán băm bảo mật bằng mật mã với thuộc tính cụ thể mà không chỉ hàm băm không thể đảo ngược NHƯNG CSONG không thể tính toán được để tạo ra BẤT K string chuỗi nào khác tạo ra cùng một hàm băm.
Cao Jeff

11
Có và không ... Các va chạm Hash cần khó tạo ra vì mục đích bảo mật của ứng dụng của bạn, nhưng không thể đảo ngược là đủ để tránh rò rỉ mật khẩu.
Dave Sherohman

5
mượt: và chính xác là bạn sẽ lấy lại mật khẩu ban đầu từ hàm băm tệ hại của bạn như thế nào? Tôi đề nghị bạn đọc lại nhận xét của Dave
Vinko Vrsalovic

1
Nếu bất cứ điều gì, một hàm băm có số lượng va chạm lớn sẽ tốt hơn cho việc bảo mật mật khẩu, tuy nhiên điều đó rõ ràng có nghĩa là nhiều mật khẩu có thể được sử dụng để đăng nhập vào tài khoản.
williamvicary

1
@ n00b muối không thể được mã hóa cứng bởi vì mỗi mục băm nên sử dụng một loại muối riêng biệt. Điểm quan trọng của muối là nếu cả UserA và UserB đều sử dụng mật khẩu "1234" nếu bạn phát hiện ra mật khẩu của UserA, bạn không thể cho UserB sử dụng cùng một mật khẩu vì chúng có các loại muối khác nhau. Điều quan trọng không phải là bảo mật rằng một muối được giữ bí mật, hầu hết các triển khai chỉ ghép muối ở mặt trước hoặc mặt sau của blob nhị phân đại diện cho hàm băm.
Scott Chamberlain

34

Băm là một hàm một chiều, có nghĩa là một khi bạn băm mật khẩu, rất khó lấy lại mật khẩu ban đầu từ hàm băm. Mã hóa là một chức năng hai chiều, trong đó việc lấy lại văn bản gốc từ văn bản được mã hóa dễ dàng hơn nhiều.

Băm đơn giản dễ dàng bị đánh bại bằng cách sử dụng tấn công từ điển, trong đó kẻ tấn công chỉ băm trước mỗi từ trong từ điển (hoặc mọi tổ hợp ký tự có độ dài nhất định), sau đó sử dụng từ điển mới này để tra cứu mật khẩu băm. Sử dụng một loại muối ngẫu nhiên duy nhất cho mỗi mật khẩu băm được lưu trữ khiến kẻ tấn công sử dụng phương pháp này khó khăn hơn nhiều. Về cơ bản họ sẽ cần tạo một từ điển độc đáo mới cho mọi giá trị muối mà bạn sử dụng, làm chậm quá trình tấn công của họ một cách khủng khiếp.

Việc lưu trữ mật khẩu bằng thuật toán mã hóa là không an toàn vì nếu người dùng hoặc quản trị viên dễ dàng lấy lại mật khẩu gốc từ văn bản được mã hóa, kẻ tấn công cũng dễ dàng làm điều tương tự hơn.


12

Mật mã được mã hóa và mật khẩu băm

Như trong hình trên, nếu mật khẩu được mã hóa, nó luôn là một bí mật ẩn trong đó ai đó có thể trích xuất mật khẩu văn bản đơn giản. Tuy nhiên, khi mật khẩu được băm, bạn cảm thấy thoải mái vì hầu như không có phương pháp nào để khôi phục mật khẩu từ giá trị băm.


Trích xuất từ Mật mã được mã hóa so với mật khẩu băm - Cái nào tốt hơn?

Mã hóa có tốt không?

Mật khẩu văn bản thuần túy có thể được mã hóa bằng các thuật toán mã hóa đối xứng như DES, AES hoặc với bất kỳ thuật toán nào khác và được lưu trữ bên trong cơ sở dữ liệu. Khi xác thực (xác nhận danh tính bằng tên người dùng và mật khẩu), ứng dụng sẽ giải mã mật khẩu được mã hóa được lưu trữ trong cơ sở dữ liệu và so sánh với mật khẩu do người dùng cung cấp cho sự bình đẳng. Trong kiểu tiếp cận xử lý mật khẩu này, ngay cả khi ai đó có quyền truy cập vào bảng cơ sở dữ liệu, mật khẩu sẽ không thể được sử dụng lại. Tuy nhiên, có một tin xấu trong phương pháp này là tốt. Nếu bằng cách nào đó ai đó có được thuật toán mã hóa cùng với khóa được sử dụng bởi ứng dụng của bạn, anh ấy / cô ấy sẽ có thể xem tất cả mật khẩu người dùng được lưu trữ trong cơ sở dữ liệu của bạn bằng cách giải mã. "Đây là lựa chọn tốt nhất tôi có", một nhà phát triển phần mềm có thể hét lên, nhưng có cách nào tốt hơn không?

Hàm băm mật mã (chỉ một chiều)

Có, có thể bạn đã bỏ lỡ điểm ở đây. Bạn có nhận thấy rằng không có yêu cầu để giải mã và so sánh? Nếu có cách tiếp cận chuyển đổi một chiều trong đó mật khẩu có thể được chuyển đổi thành một số từ được chuyển đổi, nhưng hoạt động ngược lại (tạo mật khẩu từ từ đã chuyển đổi) là không thể. Bây giờ ngay cả khi ai đó có quyền truy cập vào cơ sở dữ liệu, không có cách nào mật khẩu được sao chép hoặc trích xuất bằng cách sử dụng các từ đã chuyển đổi. Theo cách tiếp cận này, hầu như không có ai có thể biết mật khẩu tuyệt mật của người dùng của bạn; và điều này sẽ bảo vệ người dùng sử dụng cùng một mật khẩu trên nhiều ứng dụng. Những thuật toán có thể được sử dụng cho phương pháp này?


Được rồi, nhưng khi bạn đăng nhập vào một dịch vụ, mật khẩu của bạn sẽ được gửi bằng văn bản gốc / mã hóa, bởi vì nếu nó được gửi dưới dạng băm đến máy chủ để so sánh. một hacker có thể nếu họ biết băm, chỉ cần gửi băm đến máy chủ để đăng nhập. Đây là lý do tại sao mật khẩu để so sánh cần phải được mã hóa đến máy chủ, nơi chúng được giải mã và băm. Điều này có an toàn không? Chừng nào mật khẩu không bao giờ được lưu trữ ở dạng chưa được xóa trong thời gian dài và tất cả các lần xuất hiện của mật khẩu được mã hóa / văn bản gốc sẽ bị xóa khỏi bất kỳ bộ nhớ nào khi không còn cần thiết?
Đặc vụ

8

Tôi đã luôn nghĩ rằng Mã hóa có thể được chuyển đổi theo cả hai cách, theo cách mà giá trị cuối có thể đưa bạn về giá trị ban đầu và với Băm, bạn sẽ không thể hoàn nguyên từ kết quả cuối cùng thành giá trị ban đầu.


8

Các thuật toán băm thường có bản chất là mật mã, nhưng điểm khác biệt cơ bản là mã hóa có thể đảo ngược thông qua giải mã, còn băm thì không.

Một chức năng mã hóa thường lấy đầu vào và tạo đầu ra được mã hóa giống nhau hoặc kích thước lớn hơn một chút.

Hàm băm lấy đầu vào và tạo ra đầu ra thường nhỏ hơn, thường có kích thước cố định.

Mặc dù không thể lấy kết quả băm và "khử" nó để lấy lại đầu vào ban đầu, nhưng bạn thường có thể bắt buộc theo cách của bạn đến một thứ tạo ra cùng một hàm băm.

Nói cách khác, nếu một lược đồ xác thực lấy mật khẩu, băm nó và so sánh nó với một phiên bản băm của mật khẩu yêu cầu, thì có thể bạn không thực sự biết mật khẩu ban đầu, chỉ băm của nó và bạn có thể bắt bẻ theo cách của bạn để một cái gì đó sẽ phù hợp, ngay cả khi đó là một mật khẩu khác.

Các hàm băm thường được tạo để giảm thiểu khả năng va chạm và làm cho việc tính toán một thứ gì đó sẽ tạo ra hàm băm giống như một thứ khác.


4

Tốt nhất bạn nên làm cả hai.

Đầu tiên Hash mật khẩu mật khẩu cho bảo mật một chiều. Sử dụng muối để bảo mật hơn.

Sau đó mã hóa hàm băm để bảo vệ chống lại các cuộc tấn công từ điển nếu cơ sở dữ liệu băm mật khẩu của bạn bị xâm phạm.


3
Mã hóa nó bằng gì? Nếu họ làm phiền bạn đến nỗi họ truy cập vào cơ sở dữ liệu bằng tất cả mật khẩu người dùng của bạn (được băm, mã hóa hoặc bằng cách khác), liệu họ có thể tìm thấy khóa để giải mã chúng không?
Lục

5
Điều này sẽ không bị hạ cấp. Một khả năng không nên loại trừ là dễ dàng, rằng cơ sở dữ liệu bị xâm phạm trong khi ứng dụng thì không. Do đó, mã hóa hàm băm là một lớp bảo mật bổ sung.
Arie

@Luc Tôi không đồng ý với bạn, bản thân trước đây của tôi. Tôi đã thấy quá nhiều lần tiêm SQL không làm ảnh hưởng đến mã ứng dụng (hoặc tệp cấu hình) và bây giờ tôi cho rằng việc thêm một bí mật là hữu ích, dưới dạng mã hóa hoặc dưới dạng hạt tiêu, nhưng nó không được thay thế băm. Để có câu trả lời đầy đủ hơn, xem tại đây: security.stackexchange.com/a/31846/10863
Luc

3

Băm :

Nó là một thuật toán một chiều và một khi được băm không thể khôi phục và đây là điểm ngọt ngào của nó đối với mã hóa.

Mã hóa

Nếu chúng tôi thực hiện mã hóa, sẽ có một chìa khóa để làm điều này. Nếu khóa này bị rò rỉ, tất cả mật khẩu của bạn có thể được giải mã dễ dàng.

Mặt khác, ngay cả khi cơ sở dữ liệu của bạn sẽ bị hack hoặc quản trị viên máy chủ của bạn lấy dữ liệu từ DB và bạn đã sử dụng mật khẩu băm, tin tặc sẽ không thể phá vỡ các mật khẩu băm này. Điều này thực tế sẽ không thể thực hiện được nếu chúng ta sử dụng băm với muối thích hợp và bảo mật bổ sung với PBKDF2.

Nếu bạn muốn xem bạn nên viết hàm băm như thế nào, bạn có thể truy cập vào đây .

Có nhiều thuật toán để thực hiện băm.

  1. MD5 - Sử dụng hàm băm Thông báo thuật toán 5 (MD5). Băm đầu ra có chiều dài 128 bit. Thuật toán MD5 được thiết kế bởi Ron Rivest vào đầu những năm 1990 và không phải là một lựa chọn ưa thích ngày nay.

  2. SHA1 - Sử dụng hàm băm thuật toán bảo mật (SHA1) được xuất bản năm 1995. Hàm băm đầu ra có độ dài 160 bit. Mặc dù được sử dụng rộng rãi nhất, đây không phải là một lựa chọn ưa thích hiện nay.

  3. HMACSHA256 , HMACSHA384 , HMACSHA512 - Sử dụng các chức năng SHA-256, SHA-384 và SHA-512 của gia đình SHA-2. SHA-2 đã được xuất bản vào năm 2001. Độ dài băm đầu ra lần lượt là 256, 384 và 512 bit, như tên của hàm băm chỉ ra.


1

Đúng như các câu trả lời khác, trong bối cảnh trích dẫn, băm là một công cụ có thể được sử dụng để bảo mật thông tin, mã hóa là một quá trình lấy thông tin và khiến người đọc trái phép rất khó đọc / sử dụng.


-9

Đây là một lý do bạn có thể muốn sử dụng một lý do khác - truy xuất mật khẩu.

Nếu bạn chỉ lưu trữ một hàm băm của mật khẩu người dùng, bạn không thể cung cấp tính năng 'quên mật khẩu'.


16
Bạn rõ ràng đã không đọc câu trả lời được chấp nhận đủ tốt. Đọc kỹ: Bạn không được phép cung cấp tính năng truy xuất mật khẩu . Bạn phải cung cấp một tính năng đặt lại mật khẩu . Tôi đã quản lý nhiều trang web trong nhiều năm, bao gồm cả Diễn đàn, phpBB, e107, IPB, blogspot và thậm chí cả CMS được xây dựng tùy chỉnh của riêng tôi. Là quản trị viên, bạn KHÔNG BAO GIỜ cần phải có mật khẩu được băm trước của ai đó. Bạn không cần. Và bạn cũng không nên có nó. Nếu bạn không đồng ý với những gì tôi đang nói, hãy để tôi đảm bảo với bạn: bạn đã sai.
Lakey

3
Xin lỗi về việc CÁCH quá tức giận. Tôi chỉ thấy quá nhiều trang web lưu trữ mật khẩu bằng văn bản đơn giản và nó làm tôi thất vọng. Như một lưu ý phụ: một số trang web có đầu óc bảo mật muốn làm cho người dùng thay đổi mật khẩu theo định kỳ. Họ muốn đảm bảo người đó không thay đổi mật khẩu của mình từ "Password1" thành "Password2". Vì vậy, họ giữ lại mật khẩu văn bản đơn giản để thực hiện các so sánh này vào một ngày sau đó. Đó không phải là thực hành tốt. Những gì họ cần làm, trong trường hợp đó, là thực hiện phân tích trên mật khẩu FIRST, tạo ra một loạt các mật khẩu tương tự - băm từng mật khẩu - và chỉ lưu trữ băm .
Lakey

7
Không có vấn đề gì, nó khiến tôi quay lại và đọc lại câu hỏi và cũng nghiên cứu thêm, vì vậy tất cả không bị mất :-) Tôi không chắc mình đã nghĩ gì khi viết câu trả lời đó. chúc mừng
Philtron
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.