Friday, December 30, 2011

Một cách che dấu chuỗi hash MD5 của mật khẩu trong PHP

Hôm nay tôi được biết một số lập trình viên ( nước ngoài ) dùng cách sau để bảo vệ một mã hash MD5 của họ

<?php
$password = "Hehe I'm xnohat";
$hashmd5 = md5($password);
$compressedhash   = gzdeflate($hashmd5, 9);
$base64encodedhash = base64_encode($compressedhash); // S05OMTY1NkxNszQ1SzFMSTMwSzZONDA2MTFPSU1NNjdWAAA=
//-------------------Kết thúc phần tạo mã hash giả dạng Base64 Encoded------------------
$uncompressedhash = gzinflate(base64_decode($compressed));
echo $uncompressedhash; // MD5 hash nguyên thủy ban đầu
?>

Cái hay ở đây là nó tạo ra tình trạng "obscurity" , khiến kẻ tấn công khi lấy được chuỗi hash của mật khẩu sẽ cứ cố tìm cách Base64_decode cái đoạn có vẻ trông như Base64 Encoded ( S05OMTY1NkxNszQ1SzFMSTMwSzZONDA2MTFPSU1NNjdWAAA= ) để chỉ nhận được "một file nhị phân" (binary) mà không sao tìm ra chuỗi md5 gốc. 

Điều này giúp đánh bại ý chí tìm md5 hash để rồi quăng vô một số md5 rainbow table cracker để tìm mật khẩu gốc của các script kiddes ( nhất là khi ở VN tình trạng tấn công SQLi , Local attack đầy nhan nhản )

Bạn thử decode cái đoạn Base64 Encoded trên bằng công cụ online này http://www.opinionatedgeek.com/dotnet/tools/base64decode/ xem sao :D

RFC1951 (http://www.faqs.org/rfcs/rfc1951.html) viết rất rõ về DEFLATE compression algorithm này

2 comments:

  1. $uncompressedhash= gzinflate(base64_decode($compressed));
    cho hỏi $compressed ở đâu ra?

    ReplyDelete
  2. là cái $base64encodedhash chứ còn gì nữa

    ReplyDelete

Quí đọc giả đọc xong, nếu thấy chút thú vị thì tác giả cũng mong được chút comment lấy làm kích lệ