Hướng dẫn thuật toán Hash: MD5, SHA-1, SHA-256
Các hàm hash mật mã là nền tảng của bảo mật hiện đại, xác minh tính toàn vẹn dữ liệu và lưu trữ mật khẩu. Hiểu các thuật toán hash khác nhau, điểm mạnh và điểm yếu của chúng, và các trường hợp sử dụng phù hợp là cần thiết cho mọi lập trình viên làm việc với dữ liệu nhạy cảm hoặc yêu cầu bảo mật.
Hàm Hash là gì?
Hàm hash mật mã là một thuật toán toán học chuyển đổi dữ liệu đầu vào có bất kỳ kích thước nào thành một chuỗi có độ dài cố định gọi là giá trị hash hoặc digest. Các hàm này là một chiều—bạn không thể đảo ngược hash để lấy lại dữ liệu gốc. Các hàm hash mật mã tốt có một số thuộc tính quan trọng làm cho chúng hữu ích cho bảo mật. Tính xác định: cùng một đầu vào luôn tạo ra cùng một hash. Điều này cho phép xác minh—nếu bạn hash cùng một dữ liệu hai lần và nhận được các kết quả khác nhau, một cái gì đó đã sai. Tính xác định này làm cho hash hoàn hảo cho checksums và xác minh tính toàn vẹn. Hiệu ứng tuyết lở: một thay đổi nhỏ trong đầu vào tạo ra một thay đổi hoàn toàn khác nhau trong đầu ra. Thay đổi một ký tự duy nhất trong một tài liệu sẽ tạo ra một hash hoàn toàn khác. Thuộc tính này làm cho việc phát hiện ngay cả những thay đổi nhỏ nhất trong dữ liệu trở nên dễ dàng. Kháng va chạm: về mặt tính toán không thể tìm thấy hai đầu vào khác nhau tạo ra cùng một hash. Trong khi về mặt toán học có thể (không gian đầu vào vô hạn ánh xạ đến đầu ra có độ dài cố định), một hàm hash tốt làm cho việc tìm va chạm thực tế là không thể với phần cứng hiện tại. Tính một chiều: không thể tính toán thực tế để đảo ngược một hash để lấy lại đầu vào ban đầu. Ngay cả khi bạn biết thuật toán và giá trị hash, việc xác định đầu vào nào đã tạo ra nó sẽ mất thời gian tính toán nhiều năm. Thuộc tính này làm cho hash phù hợp cho lưu trữ mật khẩu. Các hàm hash được sử dụng rộng rãi trong công nghệ: xác minh tính toàn vẹn của các file đã tải xuống, lưu trữ mật khẩu một cách an toàn, chứng chỉ số và chữ ký, blockchain và cryptocurrency, hệ thống kiểm soát phiên bản như Git, và cấu trúc dữ liệu như bảng hash. Hiểu cách chọn thuật toán hash phù hợp cho mỗi trường hợp sử dụng là kỹ năng quan trọng.
MD5, SHA-1, SHA-256: Sự khác biệt
MD5 (Message Digest Algorithm 5) tạo ra hash 128-bit (32 ký tự hex). Được phát triển vào năm 1991, MD5 một thời rất phổ biến cho checksums và xác minh tính toàn vẹn. Tuy nhiên, các nhà nghiên cứu đã phát hiện ra các lỗ hổng cho phép tạo ra va chạm—hai đầu vào khác nhau tạo ra cùng một hash MD5. Ngày nay, MD5 được coi là bị phá vỡ về mặt mật mã và không nên được sử dụng cho bất kỳ mục đích bảo mật nào. Nó vẫn thấy sử dụng cho checksums không quan trọng về bảo mật và trong các hệ thống cũ, nhưng các triển khai mới nên tránh nó. SHA-1 (Secure Hash Algorithm 1) tạo ra hash 160-bit (40 ký tự hex). Được phát triển bởi NSA và xuất bản vào năm 1995, SHA-1 trở thành tiêu chuẩn cho chữ ký số và chứng chỉ. Giống như MD5, các cuộc tấn công va chạm đã được chứng minh, và SHA-1 hiện được coi là yếu về mặt mật mã. Google và các trình duyệt chính đã từ chối các chứng chỉ SSL sử dụng SHA-1. Trong khi an toàn hơn MD5, SHA-1 không nên được sử dụng cho các ứng dụng bảo mật mới. Git vẫn sử dụng SHA-1 cho việc đặt tên đối tượng, mặc dù có kế hoạch di chuyển sang các thuật toán mạnh hơn. SHA-256 là một phần của gia đình SHA-2, tạo ra hash 256-bit (64 ký tự hex). Được xuất bản vào năm 2001, SHA-256 là tiêu chuẩn hiện tại cho hầu hết các ứng dụng mật mã. Nó được sử dụng rộng rãi trong chứng chỉ SSL/TLS, Bitcoin và các cryptocurrency khác, chữ ký số, và xác minh tính toàn vẹn. Không có cuộc tấn công thực tế nào được biết đến chống lại SHA-256, làm cho nó trở thành lựa chọn an toàn cho các triển khai hiện đại. Không gian đầu ra 256-bit cung cấp đủ sức mạnh kháng va chạm cho tương lai gần. SHA-512, một thành viên khác của gia đình SHA-2, tạo ra hash 512-bit (128 ký tự hex). Nó cung cấp bảo mật thậm chí còn mạnh hơn SHA-256 nhưng với chi phí tính toán cao hơn một chút và hash dài hơn. SHA-512 được ưa thích trong các tình huống yêu cầu bảo mật cao hoặc nơi tính toán 64-bit hiệu quả hơn 32-bit. Ví dụ, các hệ thống lưu trữ mật khẩu thường sử dụng SHA-512 làm cơ sở cho các hàm derivation phức tạp hơn. Chọn thuật toán phù hợp phụ thuộc vào nhu cầu của bạn. Đối với bất kỳ ứng dụng bảo mật nào, sử dụng SHA-256 hoặc SHA-512. Tránh MD5 và SHA-1 cho bảo mật. Đối với checksums không quan trọng về bảo mật nơi tốc độ quan trọng và khả năng tương thích cũ cần thiết, MD5 vẫn có thể chấp nhận được, nhưng ngay cả ở đó, SHA-256 được ưu tiên.
Sử dụng Hash một cách an toàn
Việc sử dụng các hàm hash đúng cách đòi hỏi phải hiểu các giới hạn và thực hành tốt nhất của chúng. Lỗi phổ biến nhất là sử dụng hash đơn giản cho mật khẩu. Không bao giờ lưu trữ hash mật khẩu thuần túy—ngay cả với SHA-256. Các hash đơn giản dễ bị tấn công brute-force và tấn công bảng cầu vồng nơi kẻ tấn công trước hash các mật khẩu phổ biến và so sánh. Đối với mật khẩu, luôn sử dụng các hàm derivation khóa chuyên dụng như bcrypt, scrypt, hoặc Argon2. Các thuật toán này được thiết kế đặc biệt để hash mật khẩu và bao gồm salt tự động (dữ liệu ngẫu nhiên được thêm vào mỗi mật khẩu) và các tính năng làm chậm có chủ ý khiến cho các cuộc tấn công brute-force trở nên không thực tế về mặt tính toán. Khi sử dụng hash cho xác minh tính toàn vẹn, hãy xem xét ngữ cảnh bảo mật. Đối với việc kiểm tra các file đã tải xuống chống lại sự hỏng hóc ngẫu nhiên, ngay cả MD5 cũng đủ. Nhưng nếu bạn cần bảo vệ chống lại các sửa đổi độc hại có chủ ý, sử dụng SHA-256 hoặc tốt hơn. Một kẻ tấn công có thể cố gắng tạo một file độc hại khớp với checksum của file hợp pháp—điều này chỉ thực tế chống lại các thuật toán yếu hơn. Chữ ký số kết hợp hash với mã hóa khóa công khai. Bạn hash dữ liệu, sau đó mã hóa hash với khóa riêng của mình. Người khác có thể xác minh chữ ký bằng cách giải mã nó với khóa công khai của bạn và so sánh với hash của dữ liệu. Sức mạnh bảo mật của hệ thống này phụ thuộc vào cả thuật toán hash và thuật toán khóa công khai—điểm yếu trong một trong hai làm suy yếu toàn bộ hệ thống. Mã xác thực tin nhắn dựa trên hash (HMAC) kết hợp hàm hash với khóa bí mật để tạo mã xác thực tin nhắn. HMAC-SHA256 được sử dụng rộng rãi trong API để ký các yêu cầu và xác minh rằng chúng không bị giả mạo trong quá trình truyền. Không giống như hash đơn giản, HMAC yêu cầu biết khóa bí mật để tạo hoặc xác minh mã, cung cấp cả tính toàn vẹn và xác thực. Hiểu rằng hash không phải là mã hóa. Mã hóa là hai chiều—bạn mã hóa dữ liệu để ẩn nó và giải mã nó để khôi phục bản gốc. Hash là một chiều—một khi được hash, bạn không thể lấy lại dữ liệu gốc. Sử dụng mã hóa khi bạn cần giữ dữ liệu bí mật nhưng có thể truy cập. Sử dụng hash khi bạn cần xác minh dữ liệu hoặc tạo định danh duy nhất nhưng không bao giờ cần khôi phục giá trị gốc.
Thử công cụ
Tạo Hash
Tìm hiểu thêm
MD5 so với SHA-256
Lựa chọn giữa MD5 và SHA-256 là một quyết định quan trọng trong bảo mật. Trong khi cả hai đều là hàm hash, sức mạnh bảo mật của chúng khác nhau đáng kể.
Hash so với Mã hóa
Hash và mã hóa thường bị nhầm lẫn, nhưng chúng phục vụ các mục đích hoàn toàn khác nhau. Hiểu sự khác biệt là quan trọng cho bảo mật đúng cách.
Câu hỏi thường gặp
Tạo Hash
Câu hỏi thường gặp →