2010-10-23 35 views
13

Tôi đang học Rails, tại thời điểm này, nhưng câu trả lời không nhất thiết phải là Rails.Làm thế nào để sử dụng một muối làm cho một mật khẩu an toàn hơn nếu nó được lưu trữ trong cơ sở dữ liệu?

Vì vậy, như tôi hiểu nó, một hệ thống mật khẩu an toàn các công trình như thế này:

  • Người dùng tạo mật khẩu
  • Hệ thống mã hóa mật khẩu với một thuật toán mã hóa (nói SHA2).
  • Lưu trữ băm mật khẩu được mã hóa trong cơ sở dữ liệu.

Sau khi nỗ lực đăng nhập:

  • dùng cố gắng đăng nhập
  • Hệ thống tạo hash của nỗ lực với thuật toán mã hóa cùng
  • Hệ thống so sánh hash của nỗ lực với hash của mật khẩu trong cơ sở dữ liệu.
  • Nếu phù hợp, họ sẽ vào. Nếu không, họ phải thử lại.

Như tôi đã hiểu, cách tiếp cận này tùy thuộc vào cuộc tấn công cầu vồng - trong đó những điều sau đây có thể xảy ra.

Kẻ tấn công có thể viết tập lệnh cố định mọi hoán vị ký tự, số và ký hiệu, tạo băm với cùng thuật toán mã hóa và so sánh chúng với băm trong cơ sở dữ liệu.

Vì vậy, cách xung quanh nó là kết hợp băm với một muối duy nhất. Trong nhiều trường hợp, ngày và giờ hiện tại (xuống đến mili giây) mà người dùng đăng ký.

Tuy nhiên, muối này được lưu trữ trong cột cơ sở dữ liệu 'muối'. Vì vậy, câu hỏi của tôi là, làm thế nào điều này thay đổi thực tế rằng nếu kẻ tấn công có quyền truy cập vào cơ sở dữ liệu ở nơi đầu tiên và có băm tạo ra cho mật khẩu 'thực' và cũng có băm cho muối, làm thế nào là điều này không chỉ là tùy thuộc vào một cuộc tấn công cầu vồng? Bởi vì, lý thuyết sẽ là anh ta cố gắng mỗi hoán vị + băm muối và so sánh kết quả với băm mật khẩu. Có thể mất nhiều thời gian hơn, nhưng tôi không thấy nó thật dễ dàng.

Tha thứ cho sự thiếu hiểu biết của tôi, tôi chỉ học những thứ này và điều này không bao giờ có ý nghĩa với tôi.

+0

bản sao có thể có của [Nơi bạn lưu trữ chuỗi muối của mình?] (Http://stackoverflow.com/questions/1219899/where-do-you-store-your-salt-strings) – blowdart

+0

Không. Tôi không ủng hộ hoặc yêu cầu nếu nó có ý nghĩa hơn để lưu trữ muối ở nơi khác ngoài db. Tôi đang cố gắng khám phá ý tưởng về việc muối thực sự an toàn hơn như thế nào, trong một thời đại khi tài nguyên máy tính rẻ đến vậy. – marcamillion

+0

SHA-2 là một thuật toán băm. Hashing là một khái niệm khác để mã hóa. – wulfgarpro

Trả lời

8

Lợi thế chính của muối (được chọn ngẫu nhiên) là ngay cả khi hai người sử dụng cùng một mật khẩu, hàm băm sẽ khác nhau vì các muối sẽ khác nhau. Điều này có nghĩa là kẻ tấn công không thể tính toán trước các băm mật khẩu thông thường vì có quá nhiều giá trị muối khác nhau.

Lưu ý rằng muối không phải được giữ bí mật; nó chỉ cần đủ lớn (64-bit, nói) và đủ ngẫu nhiên mà hai người sử dụng cùng một mật khẩu có một cơ hội biến mất nhỏ cũng sử dụng cùng một muối. (Bạn có thể, nếu bạn muốn, hãy kiểm tra xem muối có phải là duy nhất không.)

+0

Oh ok. Vì vậy, ý tưởng là kẻ tấn công sẽ không thực hiện một cuộc tấn công bạo lực (so sánh chuỗi muối với băm pw trong db) bởi vì nó mất quá nhiều - miễn là hàm băm muối + pw đủ dài (64 bit) cái)? Nếu đó là trường hợp, không phải là không có ý nghĩa nhiều trong một ngày và tuổi tác khi tài nguyên máy tính rộng lớn đang nhận được rẻ hơn/miễn phí? Ví dụ, nếu kẻ tấn công có quyền truy cập vào một botnet của 1 triệu máy tính, tại sao anh ta không thể viết một kịch bản để chỉ làm so sánh sức mạnh vũ phu của mỗi muối với những triệu máy đó? – marcamillion

+3

Phải mất một thời gian khá dài để sức mạnh vũ phu là một băm, và thậm chí nếu nó dễ dàng như bạn ngụ ý, bạn vẫn sẽ ngăn chặn bất cứ ai mà không có một triệu botnet máy tính theo ý của họ. – ceejayoz

+2

Mục đích là làm cho nó khó phá vỡ mật khẩu hơn các phương pháp tấn công khác. Nếu kẻ tấn công có thể đọc cơ sở dữ liệu VÀ có đủ thời gian tính toán để xây dựng bảng cầu vồng cho giá trị muối cho mỗi tài khoản mà kẻ tấn công muốn, thì bạn hoặc kẻ tấn công đánh giá sai rủi ro/giá trị đột nhập vào trang web của bạn. – Slartibartfast

1

Kẻ tấn công không thể thực hiện tấn công bằng bàn cầu vồng và buộc phải hiệu quả hơn rất nhiều.

2

Xem câu trả lời được chấp nhận cho câu hỏi này; Where do you store your salt strings?

Nó giải thích cách bẻ khóa tấn công cầu vồng.

+0

Điều này giải thích ý tưởng đằng sau bảng cầu vồng với tôi (tức là đi ngược lại khái niệm làm str8 lên sức mạnh vũ phu của mỗi hoán vị bằng cách thực hiện tính toán trước/đoán dưới dạng bảng cầu vồng).Nhưng tôi vẫn không hiểu tại sao nó không thể crack trong một ngày và tuổi tác khi tài nguyên máy tính giá rẻ như vậy. – marcamillion

+0

Nó không phải là không thể - với đủ thời gian bạn có thể brute lực lượng một băm muối. Đây là lý do tại sao bạn vẫn thực hiện một số nỗ lực để giữ cho cơ sở dữ liệu của bạn riêng tư :) Và tất nhiên nó không phải là xem xét duy nhất. Những người khác bao gồm sử dụng một thuật toán băm tốt - nhiều người trong số họ tập trung vào được nhanh chóng băm, đó là đối diện của những gì bạn muốn khi băm mật khẩu. – Nick

+0

@Nick. Khá. Nhiều tiêu chuẩn đề nghị băm mật khẩu muối nhiều lần (thường> 1000) vì tính toán bổ sung cần thiết không cản trở việc kiểm tra một mật khẩu, nhưng cản trở đáng kể các cuộc tấn công brute-force. – dajames

8

Trước hết, những gì bạn mô tả không phải là tấn công cầu vồng, đó là một cuộc tấn công từ điển.

Thứ hai, điểm chính của việc sử dụng muối là nó chỉ làm cho cuộc sống khó khăn hơn cho kẻ tấn công. Ví dụ: nếu bạn thêm muối 32 bit vào mỗi cụm từ mật khẩu, kẻ tấn công phải băm và băm lại từng đầu vào trong từ điển ~ 4 tỷ lần và lưu trữ kết quả từ tất cả của những người đó để thành công tấn công.

Để có bất kỳ hy vọng nào có hiệu quả, một từ điển cần bao gồm thứ gì đó như một triệu đầu vào (và một triệu kết quả phù hợp). Bạn đã đề cập đến SHA-1, vì vậy hãy sử dụng nó cho ví dụ của chúng tôi. Nó tạo ra kết quả 20 byte (160-bit). Hãy đoán rằng một đầu vào trung bình là một cái gì đó giống như 8 ký tự. Điều đó có nghĩa là một từ điển cần phải là một cái gì đó giống như 28 megabyte. Tuy nhiên, với một muối 32 bit, cả kích thước và thời gian để tạo từ điển sẽ được nhân với 2 -1.

Cũng giống như cực kỳ xấp xỉ thô, giả sử sản xuất từ ​​điển (chưa được trả) mất một giờ. Làm tương tự với một muối 32 bit sẽ mất 2 -1 giờ, hoạt động trong khoảng 15 năm. Không có nhiều người sẵn sàng dành thời gian đó cho một cuộc tấn công.

Vì bạn đề cập đến bảng cầu vồng, tôi sẽ thêm rằng chúng thường lớn hơn và chậm hơn để bắt đầu. Một bảng cầu vồng điển hình sẽ dễ dàng lấp đầy một đĩa DVD, và nhân với 2 -1 mang lại một số lượng đủ lớn để lưu trữ trở thành một vấn đề nghiêm trọng (như trong đó, nhiều hơn tất cả dung lượng lưu trữ được xây dựng trong toàn bộ lịch sử của máy tính , ít nhất là trên hành tinh trái đất).

+0

Ok đủ công bằng. Toán học của bạn có ý nghĩa. Tôi có thể thấy cuộc tấn công này không phải là một cách dễ dàng, nhưng đủ để ngăn chặn những kẻ tấn công 'chưa được xác định'. Nhưng nó là công bằng để nói rằng bằng cách sử dụng một băm + muối vẫn có thể bị nứt, phải không? Ví dụ, 15 năm đó có thể được cắt giảm đáng kể với 100.000 máy tính thực hiện tính toán hoặc thậm chí 1 triệu. Nếu bạn cho rằng kẻ tấn công có tài nguyên máy tính không giới hạn về cơ bản để giải quyết vấn đề (ví dụ: họ đã tấn công Google và có trục cho tất cả các máy chủ của Google - được tìm nạp nhiều, nhưng chỉ minh họa một điểm) thì thực hiện tấn công từ điển. – marcamillion

+0

2^32-1 bit = 4,294,967,295bits = 536MByte. Trừ khi bạn có nghĩa là 2^32-1 * 32-bit, thì đó không phải là lưu trữ nhiều. Thậm chí sau đó, 2^32-1 * 32 = 17,179GB. – marcamillion

+0

@marcmillion: bạn cũng phải kết hợp các kết quả, vì vậy ngay cả với nhiều máy chủ, bạn cũng cần giao tiếp tốt, phối hợp, v.v., để làm điều đó (nhưng có, cuối cùng có thể). Không chắc chắn nơi bạn đang cố gắng để đi với toán học của bạn. Mỗi bit bạn thêm vào phím sẽ tăng gấp đôi kích thước của từ điển. –

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