2010-02-01 33 views
11

Tôi đang làm việc để thêm chức năng tạo thông báo băm vào cơ sở mã của chúng tôi. Tôi muốn sử dụng một String như là một muối băm để một khóa/cụm mật khẩu đã biết trước có thể được thêm vào trước bất cứ thứ gì cần thiết để băm. Tôi có hiểu nhầm khái niệm này không?Tôi có hiểu lầm về muối băm không?

+0

Bạn đã viết ngôn ngữ này bằng ngôn ngữ nào? –

+0

Tôi đang viết điều này trong Java –

Trả lời

18

Muối là một phần tử ngẫu nhiên được thêm vào đầu vào của hàm mật mã, với mục tiêu tác động đến việc xử lý và đầu ra theo cách khác nhau khi mỗi lệnh gọi. Muối, trái ngược với một "chìa khóa", không có nghĩa là để được giữ bí mật.

Cách đây một thế kỷ, các phương pháp mã hóa để mã hóa hoặc xác thực là "bí mật". Sau đó, với sự ra đời của máy tính, mọi người nhận ra rằng việc giữ một phương thức hoàn toàn bí mật là khó khăn, bởi vì điều này có nghĩa là giữ bí mật phần mềm. Một cái gì đó mà thường xuyên được ghi vào một đĩa, hoặc hóa thân là một số phần cứng chuyên dụng, gặp khó khăn khi được giữ bí mật. Vì vậy, các nhà nghiên cứu tách "phương pháp" thành hai khái niệm khác nhau: thuật toán (công khai và trở thành phần mềm và phần cứng) và khóa (tham số cho thuật toán, chỉ có trong RAM dễ bay hơi trong quá trình xử lý). Chìa khóa tập trung bí mật và là dữ liệu thuần túy. Khi khóa được lưu trữ trong não của một con người, nó thường được gọi là "mật khẩu" bởi vì con người tốt hơn trong việc ghi nhớ các từ hơn bit.

Sau đó, chính khóa được chia sau này. Hóa ra, để bảo mật mật mã đúng, chúng ta cần hai thứ: một tham số bí mật và một tham số biến. Về cơ bản, việc tái sử dụng cùng một khóa cho các cách sử dụng khác nhau có xu hướng tạo ra rắc rối; nó thường xuyên rò rỉ thông tin. Trong một số trường hợp (đặc biệt là mật mã dòng, nhưng cũng cho mật khẩu băm), nó bị rò rỉ quá nhiều và dẫn đến các cuộc tấn công thành công. Vì vậy, thường có nhu cầu về sự thay đổi, cái gì đó thay đổi mỗi khi phương thức mã hóa chạy. Bây giờ phần tốt là hầu hết thời gian, sự thay đổi và bí mật không cần phải được sáp nhập. Tức là, chúng tôi có thể tách riêng bí mật từ biến số . Vì vậy, chìa khóa được chia thành:

  • khóa bí mật, thường được gọi là "khóa";
  • một phần tử biến, thường được chọn ngẫu nhiên và được gọi là "muối" hoặc "IV" (dưới dạng "Giá trị ban đầu") tùy thuộc vào loại thuật toán.

Chỉ khóa cần bí mật. Phần tử biến cần phải được tất cả các bên liên quan biết đến nhưng nó có thể được công khai. Đây là một phước lành bởi vì việc chia sẻ một khóa bí mật là khó khăn; các hệ thống được sử dụng để phân phối một bí mật như vậy sẽ thấy nó đắt tiền để chứa một phần biến đổi mà mỗi lần thuật toán chạy.

Trong bối cảnh lưu trữ mật khẩu băm, giải thích trên trở thành như sau:

  • "Tái sử dụng chìa khóa" có nghĩa là hai người dùng xảy ra để lựa chọn cùng một mật khẩu. Nếu mật khẩu chỉ đơn giản là băm, thì cả hai người dùng sẽ nhận được cùng một giá trị băm và điều này sẽ hiển thị. Đây là sự rò rỉ.
  • Tương tự, không có băm, kẻ tấn công có thể sử dụng các bảng được tính toán trước để tra cứu nhanh; anh ta cũng có thể tấn công hàng ngàn mật khẩu song song. Điều này vẫn còn sử dụng cùng một rò rỉ, chỉ theo cách chứng minh tại sao rò rỉ này là xấu.
  • Giảm giá nghĩa là thêm một số dữ liệu biến vào đầu vào hàm băm. Dữ liệu biến đó là muối. Điểm của muối là hai người dùng riêng biệt nên sử dụng, càng nhiều càng tốt, các muối riêng biệt. Nhưng bộ kiểm tra mật khẩu cần phải có khả năng tính toán lại cùng một mã băm từ mật khẩu, do đó chúng phải có quyền truy cập vào muối.

Vì muối phải có thể truy cập được để xác minh nhưng không cần bảo mật, thông thường lưu trữ giá trị muối cùng với giá trị băm. Ví dụ, trên một hệ thống Linux, tôi có thể sử dụng lệnh này:

openssl passwd -1 -salt "zap" "blah" 

này tính một mật khẩu băm, với hàm băm MD5, thích hợp cho việc sử dụng trong file /etc/password hoặc /etc/shadow, cho mật khẩu "blah" và muối "zap" (ở đây, tôi chọn muối một cách rõ ràng, nhưng trong điều kiện thực tế nó nên được chọn ngẫu nhiên). Sau đó, đầu ra là:

$1$zap$t3KZajBWMA7dVxwut6y921 

trong đó ký hiệu đô la là dấu phân cách. "1" ban đầu xác định phương pháp băm (MD5). Muối ở trong đó, trong ký hiệu rõ ràng. Phần cuối cùng là đầu ra hàm băm.

Có một đặc tả (ở đâu đó) về cách muối và mật khẩu được gửi làm đầu vào cho hàm băm (ít nhất là trong mã nguồn glibc, có thể ở nơi khác).

Chỉnh sửa: trong hệ thống xác thực người dùng "đăng nhập và mật khẩu", "đăng nhập" có thể hoạt động như một muối có thể chuyển được (hai người dùng khác nhau sẽ có thông tin đăng nhập riêng biệt) nhưng điều này không nắm bắt được tình huống người dùng thay đổi mật khẩu của mình (cho dù mật khẩu mới giống với mật khẩu cũ hơn sẽ bị rò rỉ).

+1

"Muối, trái ngược với" chìa khóa ", không có nghĩa là phải bảo mật." - với một băm một chiều nổi tiếng như MD5 hoặc SHA-1, bạn phải giữ bí mật muối nếu không, việc đảo ngược mã băm của bạn được thực hiện dễ dàng hơn rất nhiều. – Paolo

+0

Nếu muối là bí mật, nó không phải là muối mà là một phần của chìa khóa. Bây giờ nó xảy ra trong một thiết lập mật khẩu băm, một muối làm công việc của nó (nó ngăn chặn rò rỉ từ mật khẩu giống hệt nhau và tấn công song song) nhưng điều đó không đủ tốt bởi vì con người thảm hại khi chọn và ghi nhớ mật khẩu tốt. Vì vậy, nó là phong tục để cố gắng giữ toàn bộ đầu ra "bảo vệ" ('/ etc/shadow' không công khai có thể đọc được); bảo mật phụ đến từ việc ẩn đầu ra băm, không phải từ việc giấu muối. Dù bằng cách nào, người xác minh vẫn phải có quyền truy cập vào muối và đầu ra băm. –

3

Bạn hiểu khái niệm một cách hoàn hảo. Chỉ cần chắc chắn rằng muối prepended có thể lặp lại mỗi lần.

2

Nếu tôi hiểu chính xác bạn, có vẻ như bạn đã hiểu đúng. Mã psuedocode cho quy trình trông giống như sau:

string saltedValue = plainTextValue + saltString; 
// or string saltedalue = saltString + plainTextValue; 

Hash(saltedValue); 

Muối chỉ thêm mức độ phức tạp khác cho những người đang cố gắng thu thập thông tin của bạn.

0

Và nó thậm chí còn tốt hơn nếu muối là khác nhau cho mỗi cụm từ mã hóa vì mỗi muối đòi hỏi bảng cầu vồng của riêng mình.

0

Điều đáng nói đến là mặc dù muối phải khác nhau đối với mỗi lần sử dụng mật khẩu, nhưng muối của bạn sẽ KHÔNG được tính từ chính mật khẩu! Điều này loại điều có upshot thực tế hoàn toàn vô hiệu hóa bảo mật của bạn.

Các vấn đề liên quan