Mã hóa không thể được đảo ngược?


9

Tôi có ấn tượng rằng một chuỗi mã hóa không thể được giải mã để giá trị ban đầu bị mất vĩnh viễn.

Tuy nhiên, nếu chuỗi sau luôn bằng "dominic" (tên của tôi), thì không thể có cách nào hợp lý để đảo ngược chuỗi đó; vì nó không phải là ngẫu nhiên cũng không dựa trên ngày / thời gian, nhưng có một phương pháp hợp lý nào không?

0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=

Không có vấn đề gì hoặc bao nhiêu lần tôi mã hóa "dominic" (chuỗi), nó luôn luôn bằng như trên. Vì vậy, không nên có một số cách để giải mã một chuỗi như vậy?

Ví dụ về những gì tôi đang nói về:

public string EncryptPassword(string password)
{
    return Convert.ToBase64String(
        System.Security.Cryptography.SHA256.Create()
        .ComputeHash(Encoding.UTF8.GetBytes(password)));
}

3
Bạn đang nói về băm mật mã của một tên (thường được sử dụng trong mật khẩu)? hoặc mã hóa (dự định sẽ được giải mã bởi người có thẩm quyền)?

11
SHA256là một hàm băm mật mã , không phải là một thuật toán mã hóa. Đây là một chức năng một chiều .

1
Từ chối trách nhiệm bắt buộc: muối băm ( en.wikipedia.org/wiki/Salt_(cryptography) ). Hơn nữa, SHA256 có xu hướng quá nhanh để không gặp vấn đề với các cuộc tấn công vũ phu sử dụng GPU chẳng hạn. Nên sử dụng một cái gì đó như PBKDF2 hoặc tiền điện tử.
Maciej Piechotka

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

1
Bạn có bối rối bởi mã hóa khóa công khai / riêng tư? Nếu người khác mã hóa tin nhắn bằng khóa chung của bạn, anh ta không thể tự mình giải mã tin nhắn đó. Chỉ bạn mới có thể giải mã được điều này - và có thể là NSA, Mossad, FSB và Tirer Geheimdienst.
ott--

Câu trả lời:


39

Mã hóa luôn có thể được đảo ngược. Điểm của mã hóa là lấy một tin nhắn và mã hóa nó bằng một khóa bí mật để chỉ một người khác có khóa mới có thể đảo ngược mã hóa và đọc tin nhắn.

Những gì bạn đang xem ở đây là băm , không giống như mã hóa, mặc dù các kỹ thuật mã hóa thường được sử dụng để thực hiện băm. Ý tưởng của hàm băm là nó sử dụng các kỹ thuật toán học phức tạp để xây dựng một giá trị mới ánh xạ tới một giá trị cũ, có thể lặp lại. Không có chìa khóa, và nó không có nghĩa là đảo ngược. Băm mã hóa mạnh được tạo ra với thuộc tính toán học, nếu bạn có giá trị Amà giá trị băm của nó là giá trị B, thì rất khó để cố tình tạo ra một giá trị khác Ccũng băm B.

Băm không cần phải đảo ngược, vì chúng được sử dụng để xác thực. Nếu bạn cho tôi tên người dùng và mật khẩu, bạn thực sự không muốn tôi lưu mật khẩu đó vào cơ sở dữ liệu của mình, bởi vì nếu ai đó xâm nhập và giành quyền truy cập vào cơ sở dữ liệu của tôi, họ có thể nhận được mật khẩu của bạn! Vì vậy, thay vào đó, tôi sẽ lưu trữ băm mật khẩu của bạn trong cơ sở dữ liệu. Sau đó, khi bạn đăng nhập, tôi kiểm tra xem liệu tên người dùng có khớp với tên của bạn không, với mục nhập mật khẩu khớp với hàm băm của mật khẩu bạn đã gửi và nếu bạn xác thực, vì rất khó tạo ra xung đột băm ( hai giá trị băm đến cùng một giá trị) với hàm băm tốt, vì vậy tôi gần như hoàn toàn chắc chắn rằng mật khẩu bạn đã sử dụng là đúng.

Một đặc tính khác của hàm băm mật mã mạnh là rất khó đảo ngược. Bạn biết rằng giá trị 0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=là giá trị băm cho " sự thống trị " bởi vì bạn đã tìm ra nó, nhưng nếu bạn không biết điều đó và không biết bắt đầu tìm kiếm ở đâu, và tất cả những gì bạn có là 0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=, nó có thể khiến bạn mất hàng tỷ trong nhiều năm để nhận ra rằng bản gốc là "thống trị", nếu băm là một thứ tốt. Một lần nữa, điều này rất hữu ích để ngăn ngừa thiệt hại tài sản thế chấp trong trường hợp danh sách mật khẩu bị đánh cắp.


2
Tôi không thể lấy một danh sách các từ đã biết và lặp đi lặp lại cho đến khi tôi tìm thấy một kết quả khớp băm? Đây có phải là lý do tại sao các trang web đề nghị thêm chữ cái và số vào mật khẩu của bạn để làm cho chúng an toàn hơn không?
dùng1477388

15
@ user1477388: Vâng, đó chính xác là lý do tại sao các trang web gợi ý điều đó. Đó là một cách nổi tiếng để tấn công mật khẩu băm: nó được gọi là "tấn công từ điển", vì những lý do rõ ràng và sử dụng những từ không có trong từ điển là một bước quan trọng để bảo mật chống lại chúng ..
Mason Wheeler

1
Có vẻ như điều này có một cái nhìn sâu sắc tốt về "không thể tin rằng những điều này không thể đảo ngược bằng cách nào đó" security.stackexchange.com/questions/11717/ Lỗi Không phải tôi muốn / có nhu cầu đảo ngược chúng; Tôi chỉ tò mò thôi.
dùng1477388

3
Một đề xuất khác là thêm một cái gì đó duy nhất vào mỗi mật khẩu trước khi nó được băm. Sự khác biệt mật khẩu một ký tự tạo ra một hàm băm hoàn toàn khác, ý tưởng là tất cả các kết quả băm của bạn sẽ là duy nhất. Mặt khác, nếu một hacker phát hiện ra hàm băm cho từ "password123", thì họ sẽ biết sử dụng nó để chống lại TẤT CẢ tên người dùng với hàm băm cụ thể đó. Có vẻ như bạn có một cái đầu tốt cho loại điều này, mặc dù vậy, chúc may mắn.
Katana314

1
@MasonWheeler: sử dụng các từ không có trong từ điển là không thực sự cần thiết, đặc biệt là xem xét cách "từ điển" được sử dụng trong một cuộc tấn công thông thường không giống như từ điển Oxford, mà là một danh sách các chuỗi được sử dụng trong mật khẩu thường . Thay vì cố gắng tránh những từ này, tốt hơn là chọn, nói, 5 từ ngẫu nhiên từ một danh sách 2000 từ hoặc hơn: một cụm từ mật khẩu, ngay cả khi từ điển 2000 từ được biết đến, mất nhiều thời gian hơn gần 100 lần buộc hơn 8 ký tự ngẫu nhiên trong số 64.
tdammers

9

Những gì bạn đang làm không phải là "mã hóa", mỗi lần; đó là "băm". Sự khác biệt chính giữa hai loại này là mã hóa thể đảo ngược dễ dàng (dĩ nhiên là có khóa chính xác), trong khi băm được thiết kế cực kỳ khó đảo ngược trong mọi trường hợp ngoài việc biết thông điệp gốc ở vị trí đầu tiên.

Về lý thuyết, băm mô phỏng một "nhà tiên tri ngẫu nhiên", một homunculus giả thuyết với bộ nhớ eidetic và cách tạo ra các số hoàn toàn ngẫu nhiên, hoàn toàn ngẫu nhiên không có giới hạn phạm vi trên. Bạn sẽ gửi cho người đàn ông nhỏ bé này một thông điệp và một trong hai điều sẽ xảy ra; hoặc là anh ta chưa bao giờ nhìn thấy tin nhắn trước đó, trong trường hợp anh ta tạo ra một số ngẫu nhiên mới và đưa nó cho bạn dưới dạng thông báo, hoặc anh ta đã thấy tin nhắn đó trước đó, và vì vậy anh ta nhớ và đưa cho bạn số anh ta tạo ra khi nhìn thấy nó lần đầu tiên. Trong mô hình lý thuyết đó, không có mối quan hệ nào giữa thông điệp và thông báo của nó và không có số nào xuất hiện hai lần từ RNG, không có khả năng xảy ra xung đột.

Thật không may, chúng ta không có một nhà tiên tri ngẫu nhiên lý tưởng; ý tưởng có những điều không thể thực tế đối với việc triển khai kỹ thuật số, chẳng hạn như khả năng của nhà tiên tri lưu trữ hiệu quả và nhớ lại mọi thông điệp từng được băm bởi bất cứ ai ở bất cứ đâu và khả năng của khách hàng chấp nhận một số có thể là hàng trăm hoặc hàng nghìn chữ số thập phân theo chiều dài Thay vào đó, chúng ta có các hàm băm, là các phép toán không thể đảo ngược (một chiều) hoạt động trên chính thông điệp, để tạo ra một phép biến đổi xác định (cùng một thông điệp => cùng một hàm băm) mà không rõ ràngmối quan hệ giữa hàm băm và thông điệp ban đầu. Như đã đề cập trong các bình luận, cũng không nên có sự thay đổi có thể dự đoán được đối với giá trị băm được tạo ra bằng cách thực hiện các thay đổi có hệ thống đối với thông báo; lý tưởng là, mỗi bit của thông báo sẽ có 50% cơ hội để thay đổi, được thay đổi thành một bit của tin nhắn.

Có nhiều cách sử dụng cho hàm băm; chúng được sử dụng để xác minh thách thức (nghĩ rằng thông tin đăng nhập như mật khẩu) mà không cần cả hai bên phải biết bí mật văn bản đơn giản và chúng được sử dụng làm tổng kiểm tra để xác minh rằng thư đã bị giả mạo hoặc bị hỏng. Chúng cũng được sử dụng trong các tình huống được gọi là "bằng chứng công việc"; nhiệm vụ tính toán khó hoàn thành nhưng dễ xác minh.

Nếu bạn đã từng tìm cách đảo ngược hiệu quả mã hóa băm SHA256 để tạo ra một thông điệp (bất kỳ tin nhắn nào) sẽ dẫn đến hàm băm đó, thì đó sẽ là một bằng chứng chứng minh rằng trên thực tế, hàm băm bị phá vỡ cơ bản. Trên thực tế, SHA256 được cho là an toàn, có nghĩa là không có phương pháp tài liệu nào, dù thực tế đến đâu, để bắt đầu với một bản tóm tắt băm và tạo ra một thông điệp va chạm đòi hỏi ít công việc hơn là chỉ đơn giản là thử mọi khả năng (đối với SHA-256 là lý tưởng 2 ^ 256 ~ = 10 ^ 77 khả năng).


Cũng có thể đáng nói rằng trong một hàm băm lý tưởng, một thay đổi một bit trong đầu vào sẽ dẫn đến thay đổi 50% các bit đầu ra. Nó được gọi là hiệu ứng tuyết lở .
một CVn

2
@ MichaelKjorling: Đặt chính xác, người ta nên mong đợi mỗi bit thay đổi với xác suất 50%, khác với (nhưng ngụ ý) trung bình hy vọng 50% bit sẽ thay đổi.
Dietrich Epp

@DietrichEpp Thật vậy, và bài viết Wikipedia tôi đã liên kết để làm rõ điều đó, nhưng người dùng cuối sẽ dễ dàng hơn trong việc định lượng số lượng bit thay đổi giữa hai đầu vào.
một CVn
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.