Sự khác biệt cơ bản giữa thuật toán băm và mã hóa


509

Tôi thấy rất nhiều nhầm lẫn giữa băm và thuật toán mã hóa và tôi muốn nghe thêm một số lời khuyên của chuyên gia về:

  1. Khi nào nên sử dụng băm vs mã hóa

  2. Điều gì làm cho thuật toán băm hoặc mã hóa khác nhau (từ cấp độ lý thuyết / toán học), nghĩa là điều gì làm cho băm không thể đảo ngược (không có sự trợ giúp của cây cầu vồng)

Dưới đây là một số Câu hỏi SO tương tự không đi sâu vào chi tiết như tôi đang tìm kiếm:

Sự khác biệt giữa Obfuscation, Băm và Mã hóa là gì?
Sự khác biệt giữa mã hóa và băm


28
Tôi có thể thấy trước đây là các câu hỏi để tham khảo mọi người khi họ nhầm lẫn giữa các điều khoản. :)
Adam Paynter

18
băm là một cách (không thể được hoàn nguyên), mã hóa là hai chiều (có thể được giải mã)
bestsss

Băm cũng hữu ích để lập chỉ mục các cấu trúc và đối tượng lớn, ví dụ: tệp. Xem bảng băm .
HABO

22
Băm giống như một máy xay thịt. Bạn có thể biến một con bò thành hamburger, nhưng không phải ngược lại.
Neil McGuigan

Tôi nhận thấy câu hỏi của tôi đã được chỉnh sửa. Tôi đã luôn biết sự khác biệt cấp cao nhất giữa hai người nhưng tò mò hơn về sự khác biệt cấp độ / toán học thấp. :) Dù bằng cách nào, rất nhiều nội dung tốt cho SO! Cảm ơn nhiều!
Kenny Cason

Câu trả lời:


738

Chà, bạn có thể tra cứu nó trên Wikipedia ... Nhưng vì bạn muốn một lời giải thích, tôi sẽ làm hết sức mình ở đây:

Hàm băm

Chúng cung cấp ánh xạ giữa đầu vào độ dài tùy ý và đầu ra (thường là) chiều dài cố định (hoặc chiều dài nhỏ hơn). Nó có thể là bất cứ thứ gì từ một crc32 đơn giản, đến hàm băm mật mã đầy đủ như MD5 hoặc SHA1 / 2/256/512. Vấn đề là có một bản đồ một chiều đang diễn ra. Luôn luôn có nhiều ánh xạ: 1 (nghĩa là sẽ luôn có xung đột) vì mọi hàm tạo ra một đầu ra nhỏ hơn khả năng nhập (Nếu bạn đưa mọi tệp 1mb có thể vào MD5, bạn sẽ nhận được rất nhiều va chạm).

Lý do họ khó (hoặc không thể thực tế) để đảo ngược là vì cách họ làm việc nội bộ. Hầu hết các hàm băm mật mã lặp đi lặp lại trên bộ đầu vào nhiều lần để tạo đầu ra. Vì vậy, nếu chúng ta xem xét từng đoạn có độ dài cố định của đầu vào (phụ thuộc vào thuật toán), hàm băm sẽ gọi đó là trạng thái hiện tại. Sau đó, nó sẽ lặp lại trạng thái và thay đổi nó sang trạng thái mới và sử dụng nó làm phản hồi cho chính nó (MD5 thực hiện điều này 64 lần cho mỗi khối dữ liệu 512 bit). Sau đó, bằng cách nào đó kết hợp các trạng thái kết quả từ tất cả các lần lặp lại với nhau để tạo thành hàm băm kết quả.

Bây giờ, nếu bạn muốn giải mã hàm băm, trước tiên bạn cần tìm ra cách chia băm đã cho thành các trạng thái lặp của nó (1 khả năng cho các đầu vào nhỏ hơn kích thước của một khối dữ liệu, nhiều cho các đầu vào lớn hơn). Sau đó, bạn cần phải đảo ngược việc lặp lại cho mỗi trạng thái. Bây giờ, để giải thích tại sao điều này RẤT khó khăn, hãy tưởng tượng cố gắng suy luận abtừ công thức sau : 10 = a + b. Có 10 kết hợp tích cực abcó thể làm việc. Bây giờ lặp lại một loạt các lần:tmp = a + b; a = b; b = tmp. Đối với 64 lần lặp, bạn có hơn 10 ^ 64 khả năng để thử. Và đó chỉ là một bổ sung đơn giản trong đó một số trạng thái được bảo tồn từ lần lặp đến lần lặp. Các hàm băm thực sự thực hiện nhiều hơn 1 thao tác (MD5 thực hiện khoảng 15 thao tác trên 4 biến trạng thái). Và vì lần lặp tiếp theo phụ thuộc vào trạng thái của lần trước và lần trước bị hủy trong việc tạo trạng thái hiện tại, nên không thể xác định trạng thái đầu vào dẫn đến trạng thái đầu ra nhất định (đối với mỗi lần lặp không ít hơn). Kết hợp điều đó, với số lượng lớn các khả năng có liên quan và giải mã ngay cả MD5 sẽ lấy một lượng tài nguyên gần như vô hạn (nhưng không phải vô hạn). Rất nhiều tài nguyên mà nó '

Chức năng mã hóa

Chúng cung cấp ánh xạ 1: 1 giữa đầu vào và đầu ra có độ dài tùy ý. Và chúng luôn luôn có thể đảo ngược. Điều quan trọng cần lưu ý là nó có thể đảo ngược bằng cách sử dụng một số phương pháp. Và nó luôn luôn là 1: 1 cho một khóa nhất định. Bây giờ, có nhiều đầu vào: các cặp khóa có thể tạo ra cùng một đầu ra (thực tế thường có, tùy thuộc vào chức năng mã hóa). Dữ liệu được mã hóa tốt không thể phân biệt với nhiễu ngẫu nhiên. Điều này khác với một đầu ra băm tốt luôn có định dạng nhất quán.

Trường hợp sử dụng

Sử dụng hàm băm khi bạn muốn so sánh một giá trị nhưng không thể lưu trữ biểu diễn đơn giản (vì bất kỳ lý do nào). Mật khẩu phải rất phù hợp với trường hợp sử dụng này vì bạn không muốn lưu trữ chúng dưới dạng văn bản đơn giản vì lý do bảo mật (và không nên). Nhưng nếu bạn muốn kiểm tra một hệ thống tập tin cho các tập tin nhạc lậu thì sao? Sẽ không thực tế khi lưu trữ 3 mb mỗi tệp nhạc. Vì vậy, thay vào đó, lấy hàm băm của tệp và lưu trữ tệp đó (md5 sẽ lưu trữ 16 byte thay vì 3mb). Bằng cách đó, bạn chỉ cần băm từng tệp và so sánh với cơ sở dữ liệu băm được lưu trữ (Điều này không hoạt động tốt trong thực tế vì mã hóa lại, thay đổi tiêu đề tệp, v.v., nhưng đó là trường hợp sử dụng ví dụ).

Sử dụng hàm băm khi bạn kiểm tra tính hợp lệ của dữ liệu đầu vào. Đó là những gì họ được thiết kế cho. Nếu bạn có 2 phần đầu vào và muốn kiểm tra xem chúng có giống nhau không, hãy chạy cả hai thông qua hàm băm. Xác suất va chạm thấp về mặt thiên văn đối với các kích cỡ đầu vào nhỏ (giả sử hàm băm tốt). Đó là lý do tại sao nên sử dụng mật khẩu. Đối với mật khẩu tối đa 32 ký tự, md5 có không gian đầu ra gấp 4 lần. SHA1 có 6 lần không gian đầu ra (xấp xỉ). SHA512 có khoảng 16 lần không gian đầu ra. Bạn không thực sự quan tâm mật khẩu là gì , bạn quan tâm nếu nó giống với mật khẩu được lưu trữ. Đó là lý do tại sao bạn nên sử dụng băm cho mật khẩu.

Sử dụng mã hóa bất cứ khi nào bạn cần để lấy lại dữ liệu đầu vào. Chú ý từ cần . Nếu bạn đang lưu trữ số thẻ tín dụng, bạn cần lấy lại chúng vào một lúc nào đó, nhưng không muốn lưu trữ chúng dưới dạng văn bản đơn giản. Vì vậy, thay vào đó, lưu trữ phiên bản được mã hóa và giữ khóa an toàn nhất có thể.

Các hàm băm cũng rất tốt để ký dữ liệu. Ví dụ: nếu bạn đang sử dụng HMAC, bạn ký một phần dữ liệu bằng cách lấy một hàm băm của dữ liệu được nối với một giá trị đã biết nhưng không được truyền (một giá trị bí mật). Vì vậy, bạn gửi văn bản đơn giản và hàm băm HMAC. Sau đó, người nhận chỉ cần băm dữ liệu đã gửi với giá trị đã biết và kiểm tra xem liệu nó có khớp với HMAC được truyền hay không. Nếu nó giống nhau, bạn biết nó không bị can thiệp bởi một bên mà không có giá trị bí mật. Điều này thường được sử dụng trong các hệ thống cookie bảo mật bởi các khung HTTP, cũng như trong việc truyền thông điệp dữ liệu qua HTTP, nơi bạn muốn đảm bảo tính toàn vẹn trong dữ liệu.

Một lưu ý về băm cho mật khẩu:

Một tính năng chính của các hàm băm mật mã là chúng phải được tạo ra rất nhanh và rất khó / chậm để đảo ngược (rất nhiều đến mức thực tế là không thể). Điều này đặt ra một vấn đề với mật khẩu. Nếu bạn lưu trữ sha512(password), bạn sẽ không làm gì để bảo vệ chống lại các bảng cầu vồng hoặc các cuộc tấn công vũ phu. Hãy nhớ rằng, hàm băm được thiết kế cho tốc độ. Vì vậy, thật tầm thường khi kẻ tấn công chỉ chạy một từ điển thông qua chức năng băm và kiểm tra từng kết quả.

Thêm một muối giúp vấn đề vì nó thêm một chút dữ liệu không xác định vào hàm băm. Vì vậy, thay vì tìm thấy bất cứ thứ gì phù hợp md5(foo), họ cần tìm thứ gì đó khi thêm vào sản phẩm muối đã biết md5(foo.salt)(điều này rất khó thực hiện). Nhưng nó vẫn không giải quyết được vấn đề tốc độ vì nếu họ biết muối thì đó chỉ là vấn đề chạy từ điển.

Vì vậy, có nhiều cách để đối phó với điều này. Một phương pháp phổ biến được gọi là tăng cường khóa (hoặc kéo dài khóa). Về cơ bản, bạn lặp đi lặp lại một hàm băm nhiều lần (thường là hàng nghìn). Điều này làm hai điều. Đầu tiên, nó làm chậm thời gian chạy của thuật toán băm. Thứ hai, nếu được thực hiện đúng (chuyển đầu vào và muối trở lại trong mỗi lần lặp) thực sự làm tăng entropy (không gian có sẵn) cho đầu ra, làm giảm cơ hội va chạm. Một thực hiện tầm thường là:

var hash = password + salt;
for (var i = 0; i < 5000; i++) {
    hash = sha512(hash + password + salt);
}

Có những cách triển khai khác, chuẩn hơn như PBKDF2 , BCrypt . Nhưng kỹ thuật này được sử dụng bởi khá nhiều hệ thống liên quan đến bảo mật (như PGP, WPA, Apache và OpenSSL).

Điểm mấu chốt, hash(password)là không đủ tốt. hash(password + salt)tốt hơn, nhưng vẫn không đủ tốt ... Sử dụng cơ chế băm kéo dài để tạo băm mật khẩu của bạn ...

Một lưu ý khác về kéo dài tầm thường

Không trong mọi trường hợp, cung cấp đầu ra của một hàm băm trực tiếp vào hàm băm :

hash = sha512(password + salt); 
for (i = 0; i < 1000; i++) {
    hash = sha512(hash); // <-- Do NOT do this!
}

Lý do cho điều này có liên quan đến va chạm. Hãy nhớ rằng tất cả các hàm băm có xung đột vì không gian đầu ra có thể (số lượng đầu ra có thể) nhỏ hơn không gian đầu vào. Để xem tại sao, hãy nhìn vào những gì xảy ra. Để nói trước điều này, chúng ta hãy đưa ra giả định rằng có 0,001% cơ hội va chạm từ sha1()( thực tế nó thấp hơn nhiều , nhưng với mục đích trình diễn).

hash1 = sha1(password + salt);

Bây giờ, hash1có xác suất va chạm là 0,001%. Nhưng khi chúng ta làm tiếp theo hash2 = sha1(hash1);, tất cả các va chạm hash1tự động trở thành va chạmhash2 . Vì vậy, bây giờ, chúng tôi có tỷ lệ của hash1 ở mức 0,001% và sha1()cuộc gọi thứ 2 thêm vào đó. Vì vậy, bây giờ, hash2có xác suất va chạm là 0,002%. Đó là gấp đôi cơ hội! Mỗi lần lặp sẽ thêm một 0.001%cơ hội va chạm khác vào kết quả. Vì vậy, với 1000 lần lặp, cơ hội va chạm đã tăng từ mức 0,001% đến 1%. Bây giờ, sự xuống cấp là tuyến tính và xác suất thực tế nhỏ hơn rất nhiều, nhưng hiệu quả là như nhau (ước tính khả năng xảy ra va chạm với md5khoảng 1 / (2 128 ) hoặc 1 / (3x10 38). Mặc dù điều đó có vẻ nhỏ, nhờ vào cuộc tấn công sinh nhật, nó không thực sự nhỏ như nó có vẻ).

Thay vào đó, bằng cách nối lại muối và mật khẩu mỗi lần, bạn sẽ giới thiệu lại dữ liệu vào hàm băm. Vì vậy, bất kỳ va chạm của bất kỳ vòng cụ thể không còn là va chạm của vòng tiếp theo. Vì thế:

hash = sha512(password + salt);
for (i = 0; i < 1000; i++) {
    hash = sha512(hash + password + salt);
}

Có cùng cơ hội va chạm với sha512chức năng bản địa . Đó là những gì bạn muốn. Sử dụng thay thế.


30
Thật tệ là các lập trình viên tại LinkedIn đã không đọc được điều này trước khi họ lưu trữ mật khẩu dưới dạng băm SHA1 không được mã hóa ... money.cnn.com/2012/06/06/tĩ/linkedin-password-hack/ trộm
Eric J.

2
@Pacerier: nó cũng nhấn mạnh một chút vào việc băm. Nó đi sâu vào chi tiết cụ thể về băm mật khẩu ...
ircmaxell

1
Tôi không hiểu làm thế nào nó có thể được ánh xạ 1 đến 1 nếu có thể có nhiều khóa dẫn đến cùng một đầu ra. Đối với DES, độ dài khóa là 56 bit và kích thước khối là 64 bit. Do đó, không có 256 khóa khác nhau có thể ánh xạ tới cùng một khối đầu ra?
mrQWERTY

1
@ Renren29 có. Bạn nói đúng. Trong thực tế, toàn bộ mật mã không phải là tính từ cũng không phải là tiêm. Tuy nhiên, đối với một khóa nhất định, đó là tính từ (mỗi văn bản đơn giản có chính xác một bản mã) nhưng không nhất thiết phải là nội dung (không phải mọi bản mã có thể có ánh xạ trở lại). Đó là lý do tại sao tôi nói nó luôn luôn là 1: 1 cho một khóa nhất định . Nếu không có nhiều khóa có thể xuất ra cùng một khối đầu ra, thì mật mã sẽ không hữu ích vì bản mã sẽ cho bạn biết điều gì đó về khóa (mà không cần biết).
ircmaxell 19/2/2015

7
Câu trả lời chính xác. Điều duy nhất của tôi là sự xuống cấp của việc kéo dài tầm thường không thể là tuyến tính hoặc cuối cùng nó sẽ vượt qua 100%. Tôi nghĩ trong ví dụ của bạn với 0,001% bước thứ hai nên là 0,001 + (1 - 0,001) * .001 hoặc 0,001999.
AlexDev

160

Một hàm băm có thể được coi là giống như nướng một ổ bánh mì. Bạn bắt đầu với đầu vào (bột, nước, men, v.v.) và sau khi áp dụng hàm băm (trộn + nướng), bạn kết thúc với một đầu ra: một ổ bánh mì.

Đi theo một cách khác là cực kỳ khó khăn - bạn thực sự không thể tách bánh mì thành bột, nước, men - một số thứ đã bị mất trong quá trình nướng, và bạn không bao giờ có thể biết chính xác lượng nước hoặc bột hoặc men được sử dụng cho một ổ bánh cụ thể, vì thông tin đó đã bị phá hủy bởi chức năng băm (hay còn gọi là lò nướng).

Về mặt lý thuyết, nhiều biến thể đầu vào khác nhau sẽ tạo ra các ổ bánh giống hệt nhau (ví dụ 2 cốc nước và 1 tsbp men tạo ra chính xác cùng một ổ như 2,1 cốc nước và 0,9tsbp men), nhưng bạn có thể biết một trong những ổ bánh đó chính xác những gì kết hợp đầu vào sản xuất nó.

Mã hóa, mặt khác, có thể được xem như một hộp ký gửi an toàn. Bất cứ thứ gì bạn đặt vào đó đều quay trở lại, miễn là bạn sở hữu chìa khóa mà nó đã bị khóa ngay từ đầu. Đó là một hoạt động đối xứng. Đưa ra một khóa và một số đầu vào, bạn nhận được một đầu ra nhất định. Cho đầu ra đó và cùng một khóa, bạn sẽ lấy lại đầu vào ban đầu. Đó là ánh xạ 1: 1.


2
Ngoại trừ việc bạn không thể dễ dàng chỉ ra rằng một chiếc bánh hamburger cụ thể hoàn toàn đến từ một con bò cụ thể, đó là một thuộc tính cơ bản của băm, vì vậy đó là một ý tưởng hài hước nhưng là một sự tương tự đáng sợ.
dùng467257

1
@caf lol thực sự và một cổ điển ở đó. Tuy nhiên, con bò hầu như không bao giờ xuất hiện trên thị trường, đó là "con bò" có ;-) Bò: sữa. Bò: thịt.
Funk Bốn mươi Niner

1
Câu chuyện đằng sau nó nghe có vẻ siêu ngon.
sitilge

44

Sử dụng băm khi bạn không muốn lấy lại đầu vào ban đầu, sử dụng mã hóa khi bạn thực hiện.

Băm lấy một số đầu vào và biến nó thành một số bit (thường được coi là một số, như số nguyên 32 bit, số nguyên 64 bit, v.v.). Cùng một đầu vào sẽ luôn tạo ra cùng một hàm băm, nhưng bạn NGUYÊN TẮC mất thông tin trong quy trình để bạn không thể tái tạo một cách đáng tin cậy đầu vào ban đầu (tuy nhiên có một vài cảnh báo về điều đó).

Mã hóa chủ yếu bảo tồn tất cả thông tin bạn đưa vào chức năng mã hóa, chỉ làm cho mọi người khó có thể quay ngược trở lại đầu vào ban đầu mà không cần sở hữu một khóa cụ thể.

Ví dụ đơn giản về băm

Đây là một ví dụ tầm thường để giúp bạn hiểu tại sao băm không thể (trong trường hợp chung) lấy lại đầu vào ban đầu. Giả sử tôi đang tạo hàm băm 1 bit. Hàm băm của tôi lấy một chuỗi bit làm đầu vào và đặt hàm băm thành 1 nếu có số bit chẵn được đặt trong chuỗi đầu vào, khác 0 nếu có số lẻ.

Thí dụ:

Input    Hash
0010     0
0011     1
0110     1
1000     0

Lưu ý rằng có nhiều giá trị đầu vào dẫn đến hàm băm là 0 và nhiều giá trị dẫn đến hàm băm là 1. Nếu bạn biết hàm băm là 0, bạn không thể biết chắc đầu vào ban đầu là gì.

Nhân tiện, hàm băm 1 bit này không chính xác được tạo ra ... hãy xem bit chẵn lẻ .

Ví dụ đơn giản về mã hóa

Bạn có thể mã hóa văn bản bằng cách sử dụng thay thế chữ cái đơn giản, giả sử nếu đầu vào là A, bạn viết B. Nếu đầu vào là B, bạn viết C. Tất cả các cách đến cuối bảng chữ cái, trong đó nếu đầu vào là Z, bạn viết lại A

Input   Encrypted
CAT     DBU
ZOO     APP

Giống như ví dụ băm đơn giản, loại mã hóa này đã được sử dụng trong lịch sử .


Điều đáng chú ý là "mã hóa" thông thường liên quan đến mã hóa mạnh và không nên nhầm lẫn với mã hóa yếu như mật mã Caesar trong ví dụ trên.
Fax

@Fax Có, nhưng những gì tạo nên mã hóa mạnh mẽ đã trở thành một thanh di chuyển trong mọi thời đại. Máy Enigma WWII của Đức gần như không thể bẻ khóa (có một bộ phim hay về nó). Hôm nay, đồng hồ thông minh của bạn có thể dễ dàng bẻ khóa nó. DES từng được cho là mạnh mẽ, cũng như MD5. Mã hóa mạnh mẽ ngày nay có nguy cơ trở thành con mồi dễ dàng cho các kỹ thuật điện toán lượng tử trong tương lai gần.
Eric J.

Chắc chắn, và luôn luôn là một ý tưởng tốt để kiểm tra ngày của các bài đăng và bài viết đưa ra lời khuyên về mật mã. Điều đó đang được nói, tôi khá chắc chắn rằng mật mã Caesar được coi là yếu ngay cả trong năm 2011.
Fax

39

Tổng quan cơ bản về kỹ thuật băm và mã hóa / giải mã là.

Băm:

Nếu bạn băm bất kỳ văn bản đơn giản nào một lần nữa, bạn không thể nhận được cùng một văn bản đơn giản từ văn bản băm . Đơn giản, đó là một quá trình một chiều.

băm


Mã hóa và giải mã:

Nếu bạn mã hóa bất kỳ văn bản đơn giản nào bằng một khóa một lần nữa, bạn có thể nhận được cùng một văn bản đơn giản bằng cách thực hiện giải mã trên văn bản được mã hóa bằng cùng một khóa (symetric) / diffrent (asymentric).

mã hóa và giải mã


CẬP NHẬT: Để giải quyết các điểm được đề cập trong câu hỏi được chỉnh sửa.

1. Khi nào nên sử dụng băm vs mã hóa

Băm là hữu ích nếu bạn muốn gửi cho ai đó một tập tin. Nhưng bạn sợ rằng người khác có thể chặn tệp và thay đổi nó. Vì vậy, một cách mà người nhận có thể đảm bảo rằng đó là tệp phù hợp nếu bạn đăng công khai giá trị băm. Bằng cách đó, người nhận có thể tính giá trị băm của tệp đã nhận và kiểm tra xem nó có khớp với giá trị băm không.

Mã hóa là tốt nếu bạn nói có một tin nhắn để gửi cho ai đó. Bạn mã hóa tin nhắn bằng một khóa và người nhận giải mã bằng cùng một khóa (hoặc thậm chí là một khóa khác) để lấy lại tin nhắn gốc. tín dụng


2. Điều gì làm cho thuật toán băm hoặc mã hóa khác biệt (từ cấp độ lý thuyết / toán học), nghĩa là điều gì làm cho băm không thể đảo ngược (không có sự trợ giúp của cây cầu vồng)

Về cơ bản băm là một hoạt động mất thông tin nhưng không mã hóa . Chúng ta hãy nhìn vào sự khác biệt trong cách toán học đơn giản để dễ hiểu , tất nhiên cả hai đều có hoạt động toán học phức tạp hơn nhiều với sự lặp lại liên quan đến nó

Mã hóa / Giải mã (Có thể đảo ngược):

Ngoài ra :

4 + 3 = 7  

Điều này có thể được đảo ngược bằng cách lấy tổng và trừ một trong các phần bổ sung

7 - 3 = 4     

Phép nhân :

4 * 5 = 20  

Điều này có thể được đảo ngược bằng cách lấy sản phẩm và chia cho một trong các yếu tố

20 / 4 = 5    

Vì vậy, ở đây chúng ta có thể giả sử một trong những phần bổ sung / yếu tố là khóa decrpytion và kết quả (7,20) là một văn bản được mã hóa.


Băm (Không thể đảo ngược):

Phân chia modulo :

22 % 7 = 1   

Điều này không thể đảo ngược vì không có thao tác nào bạn có thể thực hiện đối với thương số và cổ tức để khôi phục số chia (hoặc ngược lại).

Bạn có thể tìm thấy một hoạt động để điền vào nơi '?' Là?

1  ?  7 = 22  
1  ?  22 = 7

Vì vậy, các hàm băm có chất lượng toán học tương tự như phân chia modulo và mất thông tin.

tín dụng


26

Một lót của tôi ... nói chung Người phỏng vấn muốn câu trả lời dưới đây.

Băm là một cách. Bạn không thể chuyển đổi dữ liệu / chuỗi của mình từ mã băm.

Mã hóa là 2 cách - bạn có thể giải mã lại chuỗi được mã hóa nếu bạn có khóa bên mình.


Chào! Đó là hai dòng.
Mark Storer

17

Một chức năng Hash biến một số lượng biến có kích thước của văn bản vào một văn bản cố định cỡ.

Băm

Nguồn: https://en.wikipedia.org/wiki/Hash_feft


Hàm băm trong PHP

Một hàm băm biến một chuỗi thành một chuỗi băm. Xem bên dưới.

HASH:

$str = 'My age is 29';
$hash = hash('sha1', $str);
echo $hash; // OUTPUT: 4d675d9fbefc74a38c89e005f9d776c75d92623e

Mật khẩu thường được lưu trữ trong đại diện băm của họ thay vì dưới dạng văn bản có thể đọc được. Khi người dùng cuối muốn có quyền truy cập vào một ứng dụng được bảo vệ bằng mật khẩu thì mật khẩu phải được cung cấp trong quá trình xác thực. Khi người dùng gửi mật khẩu của mình, thì hệ thống xác thực hợp lệ sẽ nhận được mật khẩu và băm mật khẩu đã cho này. Băm mật khẩu này được so sánh với hàm băm được hệ thống biết đến. Truy cập được cấp trong trường hợp bình đẳng.

TRÁCH NHIỆM:

SHA1 là hàm băm một chiều. Điều đó có nghĩa là bạn không thể khử băm.

Tuy nhiên, bạn có thể vũ phu băm. Vui lòng xem: https://hashkiller.co.uk/sha1-decrypter.aspx .

MD5, là một hàm băm khác. Có thể tìm thấy bộ khử ẩm MD5 trên trang web này: https://www.md5online.org/ .

Để cản trở các cuộc tấn công vũ phu vào băm, một loại muối có thể được đưa ra. Trong php bạn có thể sử dụng password_hash()để tạo mật khẩu băm. Các chức năng password_hash()tự động tạo ra một muối. Để xác minh mật khẩu trên hàm băm mật khẩu (bằng muối), hãy sử dụng password_verify().

// Invoke this little script 3 times, and it will give you everytime a new hash
$password = '1234';  
$hash = password_hash($password, PASSWORD_DEFAULT);  

echo $hash; 
// OUTPUT 

$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu 

$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u 

$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW

Một mật khẩu có thể được đại diện bởi nhiều hơn một hàm băm. Khi bạn xác minh mật khẩu bằng các băm mật khẩu khác nhau bằng cách sử dụng password_verify(), thì mật khẩu sẽ được chấp nhận làm mật khẩu hợp lệ.

$password = '1234';  

$hash = '$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW';  
var_dump( password_verify($password, $hash) );

// OUTPUT 

boolean true 

boolean true 

boolean true




Một chức năng Encryption biến một văn bản vào một bản mã vô nghĩa bằng cách sử dụng một khóa mã hóa, và ngược lại. nhập mô tả hình ảnh ở đây

Nguồn: https://en.wikipedia.org/wiki/Encrypt


Mã hóa trong PHP

Hãy đi sâu vào một số mã PHP xử lý mã hóa.

--- Gia hạn Mcrypt ---

ENCRYPT:

$cipher = MCRYPT_RIJNDAEL_128;
$key = 'A_KEY';
$data = 'My age is 29';
$mode = MCRYPT_MODE_ECB;

$encryptedData = mcrypt_encrypt($cipher, $key , $data , $mode);
var_dump($encryptedData);

//OUTPUT:
string '„Ùòyªq³¿ì¼üÀpå' (length=16)

KHAI THÁC:

$decryptedData = mcrypt_decrypt($cipher, $key , $encryptedData, $mode);
$decryptedData = rtrim($decryptedData, "\0\4"); // Remove the nulls and EOTs at the END
var_dump($decryptedData);

//OUTPUT:
string 'My age is 29' (length=12)

--- Phần mở rộng OpenSSL ---

Phần mở rộng Mcrypt không được dùng nữa trong 7.1. và bị xóa trong php 7.2. Phần mở rộng OpenSSL nên được sử dụng trong php 7. Xem đoạn mã dưới đây:

$key = 'A_KEY';
$data = 'My age is 29';

// ENCRYPT
$encryptedData = openssl_encrypt($data , 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($encryptedData);

// DECRYPT    
$decryptedData = openssl_decrypt($encryptedData, 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($decryptedData);

//OUTPUT
string '4RJ8+18YkEd7Xk+tAMLz5Q==' (length=24)
string 'My age is 29' (length=12)

Lưu ý rằng PHP mcrypt hiện đã bị phản đối (tôi có thể phải làm gì đó với điều đó) và SHA-1, MD5 và ECB đều được coi là không an toàn. A_KEYkhông một AES / Rijndael 128-chìa khóa; đó là mật khẩu, không phải là đồng minh.
Maarten Bodewes

@MaartenBodewes Đúng vậy. OpenSSL là mốt nhất thời. php.net/manual/en/book.openssl.php
Julian

10

Mã hóa đối xứng:

Mã hóa đối xứng cũng có thể được gọi là mã hóa chung hoặc mã hóa bí mật chung. Trong mã hóa đối xứng, một khóa duy nhất được sử dụng cả để mã hóa và giải mã lưu lượng.

nhập mô tả hình ảnh ở đây

Mã hóa bất đối xứng:

Mã hóa bất đối xứng còn được gọi là mật mã khóa công khai. Mã hóa bất đối xứng khác với mã hóa đối xứng chủ yếu ở chỗ hai khóa được sử dụng: một để mã hóa và một để giải mã. Thuật toán mã hóa bất đối xứng phổ biến nhất là RSA.

So với mã hóa đối xứng, mã hóa bất đối xứng đặt ra gánh nặng tính toán cao và có xu hướng chậm hơn nhiều. Do đó, nó thường không được sử dụng để bảo vệ dữ liệu tải trọng. Thay vào đó, sức mạnh chính của nó là khả năng thiết lập kênh an toàn trên một phương tiện không an toàn (ví dụ: Internet). Điều này được thực hiện bằng cách trao đổi các khóa công khai, chỉ có thể được sử dụng để mã hóa dữ liệu. Khóa riêng bổ sung, không bao giờ được chia sẻ, được sử dụng để giải mã.

nhập mô tả hình ảnh ở đây

Băm:

Cuối cùng, băm là một hình thức bảo mật mật mã khác với mã hóa. Trong khi đó mã hóa là một quá trình gồm hai bước được sử dụng để mã hóa đầu tiên và sau đó giải mã một tin nhắn, băm cô đặc một thông điệp thành một giá trị có độ dài cố định không thể đảo ngược hoặc băm. Hai trong số các thuật toán băm phổ biến nhất được thấy trong mạng là MD5SHA-1.

nhập mô tả hình ảnh ở đây

Đọc thêm tại đây: http://packetlife.net/blog/2010/nov/23/symmetric-asymmetric-encoding-hashing/


Xin lỗi, tôi là người mới bảo mật, nhưng bạn có thể giải thích ý nghĩa của "thường được sử dụng để bảo vệ dữ liệu tải trọng" không?
Abdul

2
@Abdul Mã hóa bất đối xứng có gánh nặng tính toán cao nên không được sử dụng để bảo vệ dữ liệu được gửi qua mạng dưới dạng gói (tải trọng). Thay vào đó, nó được sử dụng để thiết lập kết nối mạng an toàn bằng cách sử dụng trao đổi khóa chung để bảo vệ dữ liệu.
May mắn

5
  1. Sử dụng băm khi bạn chỉ cần đi một chiều. Ví dụ: đối với mật khẩu trong một hệ thống, bạn sử dụng băm vì bạn sẽ chỉ xác minh rằng giá trị mà người dùng đã nhập, sau khi băm, khớp với giá trị trong kho lưu trữ của bạn. Với mã hóa, bạn có thể đi hai cách.

  2. thuật toán băm và thuật toán mã hóa chỉ là thuật toán toán học. Vì vậy, về mặt đó, chúng không khác nhau - tất cả chỉ là các công thức toán học. Mặc dù vậy, ngữ nghĩa khôn ngoan là có sự phân biệt rất lớn giữa băm (một chiều) và mã hóa (hai chiều). Tại sao băm không thể đảo ngược? Bởi vì chúng được thiết kế theo cách đó, bởi vì đôi khi bạn muốn hoạt động một chiều.


4

Các thuật toán mã hóa và băm hoạt động theo những cách tương tự. Trong mỗi trường hợp, cần phải tạo ra sự nhầm lẫn và khuếch tán giữa các bit. Đun sôi xuống, sự nhầm lẫn đang tạo ra một mối quan hệ phức tạp giữa khóa và bản mã, và sự khuếch tán đang lan truyền thông tin của từng bit xung quanh.

Nhiều hàm băm thực sự sử dụng thuật toán mã hóa (hoặc nguyên thủy của thuật toán mã hóa. Ví dụ, ứng cử viên SHA-3 Skein sử dụng Threefish làm phương thức cơ bản để xử lý từng khối. Sự khác biệt là thay vì giữ từng khối bản mã, chúng có tính hủy diệt xác định hợp nhất với nhau theo một chiều dài cố định


4

khi nói đến bảo mật để truyền dữ liệu tức là giao tiếp hai chiều bạn sử dụng mã hóa. Tất cả mã hóa đều cần có khóa

khi được ủy quyền bạn sử dụng băm. Không có chìa khóa nào trong băm

Băm lấy bất kỳ số lượng dữ liệu (nhị phân hoặc văn bản) và tạo ra một hàm băm có độ dài không đổi thể hiện tổng kiểm tra cho dữ liệu. Ví dụ, hàm băm có thể là 16 byte. Các thuật toán băm khác nhau tạo ra các giá trị băm có kích thước khác nhau. Rõ ràng bạn không thể tạo lại dữ liệu gốc từ hàm băm, nhưng bạn có thể băm lại dữ liệu để xem có tạo cùng giá trị băm không. Mật khẩu một chiều dựa trên Unix hoạt động theo cách này. Mật khẩu được lưu dưới dạng giá trị băm và để đăng nhập vào hệ thống, mật khẩu bạn nhập được băm và giá trị băm được so sánh với giá trị băm của mật khẩu thực. Nếu chúng khớp, thì bạn phải nhập đúng mật khẩu

Tại sao băm không thể đảo ngược:

Băm không thể đảo ngược vì ánh xạ đầu vào-băm không phải là 1 trên 1. Có hai ánh xạ đầu vào đến cùng một giá trị băm thường được gọi là "xung đột băm". Vì mục đích bảo mật, một trong những đặc tính của hàm băm "tốt" là va chạm rất hiếm khi sử dụng thực tế.


1
"Băm không thể đảo ngược vì ánh xạ đầu vào băm không phải là 1 trên 1", Cảm ơn, tôi nghĩ đó là một yếu tố rất quan trọng khi phân biệt băm với mã hóa! :)
Kenny Cason

Điều này không phân biệt rõ ràng giữa các hàm băm thông thường, hàm băm mật mã và băm mật khẩu. Những cái đó đều có tính chất khác nhau.
Maarten Bodewes

-2

Mật mã giao dịch với số và chuỗi. Về cơ bản mọi thứ kỹ thuật số trong toàn bộ vũ trụ đều là những con số. Khi tôi nói số, nó là 0 & 1. Bạn biết chúng là gì, nhị phân. Những hình ảnh bạn nhìn thấy trên màn hình, âm nhạc mà bạn nghe qua tai nghe, mọi thứ đều là nhị phân. Nhưng tai và mắt của chúng ta sẽ không hiểu nhị phân phải không? Chỉ có não mới có thể hiểu điều đó, và ngay cả khi nó có thể hiểu nhị phân, nó không thể thưởng thức nhị phân. Vì vậy, chúng tôi chuyển đổi các nhị phân thành các định dạng dễ hiểu của con người như mp3, jpg, v.v. Hãy gọi quá trình là Mã hóa . Đó là quá trình hai chiều và có thể dễ dàng giải mã trở lại dạng ban đầu.

Băm

Băm là một kỹ thuật mã hóa khác, trong đó dữ liệu một khi được chuyển đổi sang một dạng khác không bao giờ có thể được phục hồi. Trong nhiệm kỳ của Layman, không có quá trình nào gọi là khử băm . Có nhiều hàm băm để thực hiện công việc như sha-512, md5, v.v.

Nếu giá trị ban đầu không thể được phục hồi, vậy thì chúng ta sẽ sử dụng giá trị này ở đâu? Mật khẩu! Khi bạn thiết lập mật khẩu cho điện thoại di động hoặc PC, hàm băm mật khẩu của bạn sẽ được tạo và lưu trữ ở nơi an toàn. Khi bạn thực hiện một lần thử đăng nhập vào lần tới, chuỗi đã nhập lại được băm với cùng một thuật toán (hàm băm) và đầu ra được khớp với giá trị được lưu trữ. Nếu nó giống nhau, bạn sẽ đăng nhập. Nếu không, bạn sẽ bị ném ra ngoài.

Tín dụng: wikidia Bằng cách áp dụng hàm băm cho mật khẩu, chúng tôi có thể đảm bảo rằng kẻ tấn công sẽ không bao giờ lấy được mật khẩu của chúng tôi ngay cả khi anh ta đánh cắp tệp mật khẩu được lưu trữ. Kẻ tấn công sẽ có hàm băm của mật khẩu. Anh ta có thể có thể tìm thấy một danh sách các mật khẩu được sử dụng phổ biến nhất và áp dụng sha-512 cho từng mật khẩu và so sánh nó với giá trị trong tay anh ta. Nó được gọi là cuộc tấn công từ điển . Nhưng anh ấy sẽ làm điều này trong bao lâu? Nếu mật khẩu của bạn đủ ngẫu nhiên, bạn có nghĩ phương pháp bẻ khóa này sẽ hiệu quả không? Tất cả mật khẩu trong cơ sở dữ liệu của Facebook, Google và Amazon đều được băm hoặc ít nhất là chúng được cho là băm.

Sau đó là Mã hóa

Mã hóa nằm ở giữa băm và mã hóa. Mã hóa là một quá trình hai chiều và không nên được sử dụng để cung cấp bảo mật. Mã hóa cũng là một quá trình hai chiều, nhưng dữ liệu gốc có thể được truy xuất khi và chỉ khi biết khóa mã hóa. Nếu bạn không biết cách mã hóa hoạt động, đừng lo lắng, chúng tôi sẽ thảo luận về những điều cơ bản ở đây. Điều đó là đủ để hiểu những điều cơ bản của SSL. Vì vậy, có hai loại Mã hóa là mã hóa Đối xứng và Mã hóa đối xứng.

Mã hóa khóa đối xứng

Tôi đang cố gắng giữ mọi thứ đơn giản nhất có thể. Vì vậy, hãy hiểu mã hóa đối xứng bằng thuật toán dịch chuyển. Thuật toán này được sử dụng để mã hóa bảng chữ cái bằng cách dịch chuyển các chữ cái sang trái hoặc phải. Hãy lấy chuỗi CRYPTO và xem xét số +3. Sau đó, định dạng được mã hóa của CRYPTO sẽ là FUBSWR. Điều đó có nghĩa là mỗi chữ cái được dịch sang phải 3 vị trí. Ở đây, CRYPTO từ được gọi là Plaintext , các FUBSWR đầu ra được gọi là bản mã , giá trị 3 được gọi là Encryption key (khóa đối xứng) và toàn bộ quá trình là một mật mã. Đây là một trong những thuật toán mã hóa khóa đối xứng cơ bản và lâu đời nhất và lần sử dụng đầu tiên được báo cáo trong thời gian của Julius Caesar. Vì vậy, nó được đặt theo tên ông và đó là Mật mã Caesar nổi tiếng . Bất cứ ai biết khóa mã hóa và có thể áp dụng ngược lại thuật toán của Caesar và truy xuất Bản rõ gốc. Do đó, nó được gọi là Mã hóa đối xứng .

Mã hóa khóa bất đối xứng

Chúng tôi biết rằng, trong mã hóa đối xứng, cùng một khóa được sử dụng cho cả mã hóa và giải mã. Khi khóa đó bị đánh cắp, tất cả dữ liệu sẽ biến mất. Đó là một rủi ro lớn và chúng tôi cần kỹ thuật phức tạp hơn. Năm 1976, Whitfield Diffie và Martin Hellman lần đầu tiên công bố khái niệm mã hóa bất đối xứng và thuật toán được gọi là trao đổi khóa Diffie mẹo Hellman . Sau đó vào năm 1978, Ron Rivest, Adi Shamir và Leonard Adeld của MIT đã xuất bản thuật toán RSA . Đây có thể được coi là nền tảng của mật mã bất đối xứng.

So với mã hóa đối xứng, trong mã hóa bất đối xứng , sẽ có hai khóa thay vì một. Một cái được gọi là khóa chung và một cái khác là khóa riêng . Về mặt lý thuyết, trong quá trình bắt đầu, chúng ta có thể tạo ra Public-Privatecặp chìa khóa cho máy của chúng tôi. Khóa riêng nên được giữ ở nơi an toàn và không bao giờ được chia sẻ với bất kỳ ai. Khóa công khai, như tên cho thấy, có thể được chia sẻ với bất kỳ ai muốn gửi văn bản được mã hóa cho bạn. Bây giờ, những người có khóa công khai của bạn có thể mã hóa dữ liệu bí mật với nó. Nếu cặp khóa được tạo bằng thuật toán RSA, thì chúng nên sử dụng cùng một thuật toán trong khi mã hóa dữ liệu. Thông thường thuật toán sẽ được chỉ định trong khóa chung. Dữ liệu được mã hóa chỉ có thể được giải mã bằng khóa riêng do bạn sở hữu.

Nguồn: SSL / TLS cho người giả phần 1: Ciphersuite, Băm, Mã hóa | WST ( https://www.wst.space/ssl-part1-ciphersuite-hashing-encoding/ )


-3

Mã hóa Mục đích của mã hóa là biến đổi dữ liệu để giữ bí mật Eg (Gửi cho ai đó một văn bản bí mật mà họ chỉ có thể đọc, gửi mật khẩu qua Internet).

Thay vì tập trung vào khả năng sử dụng, mục tiêu là đảm bảo dữ liệu gửi có thể được gửi bí mật và nó chỉ có thể được nhìn thấy bởi người dùng mà bạn đã gửi.

Nó mã hóa dữ liệu thành một định dạng khác để chuyển đổi nó thành một mẫu duy nhất mà nó có thể được mã hóa bằng khóa bí mật và những người dùng có khóa bí mật có thể xem tin nhắn bằng cách đảo ngược quá trình. Ví dụ: (AES, BLOWFISH, RSA)

Mã hóa có thể trông giống như FhQp6U4N28GITVGjdt37hZN này

Băm Trong kỹ thuật, chúng ta có thể nói nó như là một đầu vào tùy ý và tạo ra một chuỗi có độ dài cố định.

Điều quan trọng nhất trong số này là bạn không thể đi từ đầu ra đến đầu vào. Nó tạo ra đầu ra mạnh mẽ mà thông tin đã cho chưa được sửa đổi. Quá trình này là lấy một đầu vào và băm nó và sau đó gửi bằng khóa riêng của người gửi sau khi người nhận nhận được, họ có thể xác thực nó bằng khóa chung của người gửi.

Nếu hàm băm sai và không khớp với hàm băm, chúng ta không thể thấy bất kỳ thông tin nào. Ví dụ: (MD5, SHA .....)

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.