Về hàm md5 trong PHP [Archive] – Diễn Đàn Tin Học

View Full Version : Về hàm md5 trong PHP

sacroyant

Xin hỏi các bác nhiều kinh nghiệm với PHP, hàm md5 có đủ độ tin cậy trong việc mã hoá password trước khi lưu vào database không ? Từ trước đến nay có ai nói về việc giải mã thành công 1 chuỗi được mã hoá bằng hàm md5 trong PHP không ?

Mặc định md5 chuyển chuỗi bất kỳ thành 1 chuỗi 32 ký tự. 1 tham số mới được đưa vào PHP 5.05 cho phép người lập trình xác định chiều dài của chuỗi sau mã hoá là 16 ký tự. Mã hoá ra nhiều ký tự hơn thế, chẳng hạn 64 ký tự có tốt không ? Gọi md5 nhiều lần lồng nhau có hiệu quả hơn không và ảnh hưởng đến tốc độ xử lý như thế nào?

pcdinhNếu pass của bạn gồm những vần âm alpha va số gồm 6 kí tự trở xuống được mã hóa md5 với salt mặc định, tớ sẽ vui vẻ bẻ nó trong 0.3 giây với độ đúng mực 100 %. md5 hết thời rồi. Trong PHP bạn còn sử dụng được tối thiểu 30 thuật toán mã hóa có độ an toàn và đáng tin cậy cao hơn .
3 domd5 chỉ hết thời với ” những vần âm alpha và số 6 kí tự trở xuống và salt mặc định ” của bác pcdinh thôi lol
bonghongdemMD5 thực ra nó mã hóa từng kỹ tự khi nhập vào .
jiSh @ nChuỗi đơn thuần thì hoàn toàn có thể dùng từ điển để ” bẻ ” md5. Chuỗi phức tạp thì trước đây MD5-RC64 đã bị bẻ, gần đây là SHA-1 bằng cách dùng năng lượng giải quyết và xử lý của rất nhiều máy tính để thực thi ứng dụng phân tán .
conmaleleVậy thôi em khỏi dùng, để thông thường vậy đã hơn 😀
NumPad0Bác Định bác í dọa thôi. Pass chơi 6 ký tự trở lên, CaSe và có tối thiểu 3 ký tự không phải alpha hoặc số thì bác bruteforce chắc phát khóc. 😀
conan1212

Mệt bác pcdinh quá, chơi mà hù bạn í, làm em và những người đang sử dụng md5 sợ hãi nè. :hang:

Mã hóa md5 kèm theo vài thủ thuật đặc biệt [đảo chuổi, thêm vài kí tự đặc biệt vào …] nữa cho bác Định tìm, cách của em là thời đồ đá đó bác, hy vọng bác sử dụng đc lol

sacroyant

Cảm ơn các bác đã cho ý kiến.

md5 là 1 hàm được xây dựng sẵn để phức tạp hóa 1 chuỗi đơn giản, như vậy chắc chắn nó phải là đối tượng được quan tâm nghiên cứu của nhiều hacker. Chắc bác pcdinh không nói quá đâu 🙂

Tôi cũng làm như cách bác conan1212, thêm bớt vài chỗ, kết hợp cả JavaScript phía client nữa, để làm cho chuỗi đã mã hóa dài tới 81 ký tự ! Nhưng vẫn cảm thấy không ổn lắm. Vậy xin các bác cho biết trong PHP còn những thuật toán mã hóa ký tự nào nữa ?

conmaleleLo bò đen răng quá ông ơi, thêm 1 cái salt ngẫu nhiên nữa là xong hết, có cái gì mà phải sợ thấy phát ớn. Thằng Yahoo nó mã hóa base64 đó, ngon thằng nào giải ra đi, cái nick trong 360 Yahoo đó
conank

Anh Định nói đúng mà. Trên trang web em check, các chữ cái alpha va số gồm 6 kí tự trở xuống được mã hóa md5 với salt mặc định bị bẻ nhanh chóng.

Free nên chỉ dò được vậy thôi

Còn đồ xịn nghe nói đến 50DVD dữ liệu, chắc bẻ được hết 😀

conmalele

Anh Định nói đúng mà. Trên trang web em check, các chữ cái alpha va số gồm 6 kí tự trở xuống được mã hóa md5 với salt mặc định bị bẻ nhanh chóng.

Free nên chỉ dò được vậy thôi

Còn đồ xịn nghe nói đến 50DVD dữ liệu, chắc bẻ được hết 😀

Có cả 10000000000000000 DVD cũng chả bẻ được hết

pcdinh

md5 được bẻ với độ phức tạp của thuật toán là O(n*n*n*n) (n mũ 4). Sự khác biệt với n mũ n đã cho thấy md5 có flaw về mặt thuật toán chứ. Trên Windows thì script này chạy hơi nặng nhưng trên Linux thì 4 vòng lặp lồng nhau như vậy cũng nhanh thôi :D. Nói chung thì đừng hi vọng user của bạn tạo ra được 1 strong password đủ mạnh để máy PC của người tấn công mất nhiều giờ để *****.

Nếu bạn muốn dùng salt thì bạn cũng phải biết cách dùng đấy. Scamble như conan1212 cũng là một cách. Nhưng scamble chỉ bằng appending tạm gọi là salt thì no security.

Còn md5 để dùng cho check integrity thì dùng bình thường.

Các mã hóa mặc định khác mà PHP hỗ trợ:

md2 md4 md5 sha1 sha256 sha384 sha512 ripemd128 ripemd160 ripemd256 ripemd320 whirlpool tiger128,3 tiger160,3 tiger192,3 tiger128,4 tiger160,4 tiger192,4 snefru gost adler32 crc32 crc32b haval128,3 haval160,3 haval192,3 haval224,3 haval256,3 haval128,4 haval160,4 haval192,4 haval224,4 haval256,4 haval128,5 haval160,5 haval192,5 haval224,5 haval256,5

An toàn hiện nay là dùng sha256. Về tốc độ thì mất đi chút ít so với sha1 nhưng sha1 cũng bị bẻ rồi.

Nếu bạn cài thư viện mcrypt:

cast-128 gost rijndael-128 twofish arcfour cast-256 loki97 rijndael-192 saferplus wake blowfish-compat des rijndael-256 serpent xtea blowfish enigma rc2 tripledes

@PS: Bạn nào muốn ***** pass của ai đó phù hợp với quy tắc 0.3s mà tôi đã nói ở trên vui lòng để lại request. Còn phức tạp hơn xin kiếu, bruceforce tốn tài nguyên lắm 😀 Thuê bọn Nga ý, chúng nó viết bằng C chạy hơn PHP nhiều. Hơn nữa chúng nó xây dựng được cả bộ từ điển trên 1oo triệu hash rồi mà.

conmalele

Anh bẻ giùm em cái nì:
base64: y91MdW41dJnh74yMmz2fX5U
và thêm 1 cái nì nữa:
md5: e11eb68efd817773 (pass gốc là 4 kí tự)

scripter

Hehe, bác conmalele rất thực tế, thích ghêêê vậy đó!
Mình bó tay rùi, ai bẻ được post lên gấp hén, subcribe chủ đề này cái 😀

emhoclop1

conmalele có phải là không biết về md5 không đấy?

e11eb68efd817773 không phải là hash của md5 của RSA. ;D

sacroyant

Hay quá, thank các bác. Không ngờ số lượng các hàm PHP hỗ trợ mã hóa lại nhiều thế ! Kiểu này tôi kết hợp sha256 với md5 thì ổn rồi 🙂

Sao emhoclop1 lại xác định được “e11eb68efd817773 không phải là hash của md5”, vậy là có 1 nguyên tắc nào đó để bạn nhận ra được 1 chuỗi được mã hóa bằng md5 à ? Xin vui lòng chỉ giáo.

conmalele

conmalele có phải là không biết về md5 không đấy?

e11eb68efd817773 không phải là hash của md5 của RSA. ;D

4f2711f8e11eb68efd817773b883a1b8 => e11eb68efd817773
Có ai bắt mã hóa pass phải để đủ 32 kí tự đâu, heh hehehe, ngon thì giải đêêêêêêêêêêêêêêêê………… pas gốc chỉ 4 kí tự thôi

cái nick đónếu cắt kiểu đó liệu hoàn toàn có thể trùng không nhỉ : – s
conmalele

nếu cắt kiểu đó liệu có thể trùng không nhỉ :-s

Đâu phải chỉ cắt không, còn những kĩ thuật khác nữa, 100% không bao giờ trùng.

conan1212Hic bác PCDINH bắt con ma này lại thử xem seo, hắn thách bác kìa .
pcdinhƠ hay, ai mà đi chơi với scramble cơ chứ. Không thuộc điều lệ gì cả .
jiSh @ n

Đâu phải chỉ cắt không, còn những kĩ thuật khác nữa, 100% không bao giờ trùng.

Bạn đã chứng minh cái con số 100% chưa?

cái nick đónếu tích hợp nhiều cái với nhau thì sẽ khó mà dịch ngược được

conmalele

nếu kết hợp nhiều cái với nhau thì sẽ khó mà dịch ngược được

Rất đúng, giờ đâu có ai ngu mà dùng không md5, phải kết hợp thêm 1 tí nữa, vậy là khỏi có cơ hội luôn 😀

Tạo ra được 100 triệu hash nhưng có tạo được 100tr^n hash không?

conmalele

Bạn đã chứng minh cái con số 100% chưa?

function _md5($s)
{
return substr(md5($s),8,16);
}
function _pass($p,$s=”)
{
return _md5(_md5($p.$s));
}

function md5_base64 ( $data )
{
return preg_replace(‘/=+$/’,”,base64_encode(pack(‘H*’,md5($data))));
}

echo _pass(md5_base64(‘cubu’)).’
‘;
echo md5_base64(‘cubu’);
?>

Đó là đoạn mã em dùng, bác “xì pam mờ” tính liệu nó có bị trùng không 😀

conmaleleSao không ai buôn chuyện gì nữa ta, còn chiêu nào ngon không, share ra cho vui
rilwismd5 mà biến hóa như conmalele kia thì bẻ nó chắc cũng chết rồi. Thử như cách của VBB làm là md5 ( md5 ( ” password ” ) ) ; thì cũng đủ mệt rùi .
cái nick đó

hàm này chôm từ 1 bác trên PHP, chắc cũng đc:

function crypto($text, $salt0 = ‘hsd8enC9f^kd@op ‘, $salt1 = ‘hD9 :2oP’)
{
$salt[0] = $salt0; // Limit this to 16 characters
$salt[1] = $salt1; // Limit this to 8 characters
$crypt[0] = crc32($text);
$crypt[1] = crypt($text, $salt[0]);
$crypt[2] = bin2hex(md5($text, true));
$crypt = implode($salt[1], $crypt);

return sha1($text. $crypt);
}

pcdinh

Mấy bố này bánh vẽ nhiều quá. Làm thế để làm gì?
Hậu quả:
+ Tính hiệu quả của thuật toán mang tính kinh nghiệm mà chưa được kiểm chứng
+ Tốc độ chậm
+ Bug tiềm ẩn

md5 và sha1 bị bẻ rồi thì dùng sha256. Làm gì mà cứ phức tạp tình huống lên.

minhquan1712cho cái máy xịn như cái blue gì gì đó ( super computer ) công với cái password pro thì md5 mã hóa 2 lần của PHP hay VBB cũng chịu thua ^ ^
conmalele

Mấy bố này bánh vẽ nhiều quá. Làm thế để làm gì?
Hậu quả:
+ Tính hiệu quả của thuật toán mang tính kinh nghiệm mà chưa được kiểm chứng
+ Tốc độ chậm
+ Bug tiềm ẩn

md5 và sha1 bị bẻ rồi thì dùng sha256. Làm gì mà cứ phức tạp tình huống lên.
+ Không cần kiểm chứng cũng thấy nó chẵng bao giờ trùng
+ Chậm khoảng bao nhiêu? Bác kiểm chứng thử xem
+ Vậy bác có chắc sha256 không có bug tìm ẩn?

md5 mà biến hóa như conmalele kia thì bẻ nó chắc cũng chết rồi. Thử như cách của VBB làm là md5(md5(“password”)); thì cũng đủ mệt rùi.
Trong đoạn mã kia cũng học tập của vbb, ($p.$s) $s là salt

subvậy túm lại mình chỉ cần bắt pasword có khoảng chừng 8 ký tự và vẫn dùng md5 thì có bảo đảm an toàn không ạ
jiSh @ n

+ Không cần kiểm chứng cũng thấy nó chẵng bao giờ trùng
+ Chậm khoảng bao nhiêu? Bác kiểm chứng thử xem
+ Vậy bác có chắc sha256 không có bug tìm ẩn?

Trong đoạn mã kia cũng học tập của vbb, ($p.$s) $s là salt
Bạn thấy ko trùng ko có nghĩa là tất cả mọi người đều như vậy. Nói đến mã hóa là phải nói đến toán học, mọi thứ đều phải chứng minh, chứ ko phải “dễ nhận thấy…”. MD5 sinh ra 1 chuỗi unique nhưng ko có nghĩa là là mọi thuật toán hash dựa vào md5 đều cho ra chuỗi unique. Không trùng trên 1 triệu, 1 tỷ… mẫu thử ko có nghĩa là luôn luôn unique. Để đảm bảo cho thuật toán hash của bạn luôn luôn sinh ra chuỗi unique thì bạn phải chứng minh bằng toán.

Bản thân các thuật toán MD5 hay SHA đều ko có bug. Các nhà toán học đã chứng minh và phản biện trước khi nó được áp dụng và trở thành chuẩn. MD5 và SHA1 bị bẻ ko phải do bug mà do sử dụng một lượng máy tính khổng lổ (khoảng 300.000) chạy phân tán (fold) để dò và cũng phải mất 1 thời gian dài (3 năm) mới thành công. Với SHA256 thì cũng có thể dò được, nhưng chắc ko ai rảnh để bắt đầu dự án dò SHA256 rồi để cháu chít lấy kết quả nhỉ?

conmalele

Bạn thấy ko trùng ko có nghĩa là tất cả mọi người đều như vậy. Nói đến mã hóa là phải nói đến toán học, mọi thứ đều phải chứng minh, chứ ko phải “dễ nhận thấy…”. MD5 sinh ra 1 chuỗi unique nhưng ko có nghĩa là là mọi thuật toán hash dựa vào md5 đều cho ra chuỗi unique. Không trùng trên 1 triệu, 1 tỷ… mẫu thử ko có nghĩa là luôn luôn unique. Để đảm bảo cho thuật toán hash của bạn luôn luôn sinh ra chuỗi unique thì bạn phải chứng minh bằng toán.

Bản thân các thuật toán MD5 hay SHA đều ko có bug. Các nhà toán học đã chứng minh và phản biện trước khi nó được áp dụng và trở thành chuẩn. MD5 và SHA1 bị bẻ ko phải do bug mà do sử dụng một lượng máy tính khổng lổ (khoảng 300.000) chạy phân tán (fold) để dò và cũng phải mất 1 thời gian dài (3 năm) mới thành công. Với SHA256 thì cũng có thể dò được, nhưng chắc ko ai rảnh để bắt đầu dự án dò SHA256 rồi để cháu chít lấy kết quả nhỉ?

Bác xpm nên xem lại các hàm mã hóa kia, sau đó nghĩ đến tính “bắt cầu” xem có trùng không nhé. Còn nếu sợ trùng thì chỉ việc đổi thành: _md5(md5(…….)), có khi nào unique>unique>unique trùng không nhỉ, chắc phải nhờ các cao thủ ra tay test thử thôi 😀

Giờ em chuyển qua 1024-bit RSA keys rồi 😀

jiSh @ n

Bác xpm nên xem lại các hàm mã hóa kia, sau đó nghĩ đến tính “bắt cầu” xem có trùng không nhé. Còn nếu sợ trùng thì chỉ việc đổi thành: _md5(md5(…….)), có khi nào unique>unique>unique trùng không nhỉ, chắc phải nhờ các cao thủ ra tay test thử thôi 😀

Giờ em chuyển qua 1024-bit RSA keys rồi 😀

md5() thì unique nhưng substr(md5()) có unique 100% hay ko nhỉ?

conmalele

md5() thì unique nhưng substr(md5()) có unique 100% hay ko nhỉ?

Về học lại md5 đi bác xì pam mờ ơi

conmaleleVà nhớ xem lại cái hàm _pass ( ) kia nha
sacroyant

Tôi nghĩ cứ kết hợp md5 với sha1 thì chắc cũng ổn rồi. 72 là 1 con số đẹp 🙂

define(“AP”,16);
function mdsha($p){
$pa=md5($p);$pn=”;
$pn.=sha1(substr($pa,0,AP));
$pn.=md5(substr($pa,AP,AP*2));
return $pn;
}

Bác nào muốn phá mã của tôi thì phải hóa giải hai phần, mỗi phần bằng 1 thuật toán. Sau đó lại phải gỡ md5 cho cái tìm ra được. CŨng khá mất thời gian đấy !

conmalele

@sacroyant: Nếu CSDL có nhiều user thì e là hơi phí dung lượng lưu trữ. Còn nói theo bác pcdinh thì chạy chậm 😀 dùng biến $AP trong hàm luôn chứ làm hằng tốn bộ nhớ 😀 Chênh lệch không bao nhiêu nhưng vẫn cứ so sánh cho bằng được 😀

Bàn thêm 1 cái về substr(md5(),8,16). md5 là unique, trong 1 chuỗi có 32 kí tự, sau đó tách ra còn 16 kí tự giữ, đối với md5, không bao giờ có trường hợp 16 kí tự đứng liền nhau, cùng vị trí lại trùng với chuỗi bị mã hóa khác. Các thuộc mã hóa 1 chiều cũng vậy. Còn bác xìpammờ muốn chừng minh nó bị trùng thì dùng toán học, thống kê và phân tích đi bác 😀 chứng mình là nó bị trùng đi bác 😀

concocnho

Nếu pass của bạn gồm các chữ cái alpha va số gồm 6 kí tự trở xuống được mã hóa md5 với salt mặc định, tớ sẽ vui lòng bẻ nó trong 0.3 giây với độ chính xác 100%. md5 hết thời rồi. Trong PHP bạn còn sử dụng được ít nhất 30 thuật toán mã hóa có độ tin cậy cao hơn.

Nhớ cách đây vài năm em vào 1 diển đàn, hình như là hva nghe có người nói md5 là dạng mã hóa 1 chiều hiện nay trên thế giới chưa ai giải mã được ! chán ghê đúng là ko có gì là tuyệt đối

conmalele

Nhớ cách đây vài năm em vào 1 diển đàn, hình như là hva nghe có người nói md5 là dạng mã hóa 1 chiều hiện nay trên thế giới chưa ai giải mã được ! chán ghê đúng là ko có gì là tuyệt đối

Đúng là không có gì tuyệt đối cả, SHA-256/224 hay SHA-512/384 hôm nay chưa giải ra được nhưng ngày mai thì không ai biết. Vì vậy nên viết thêm 1 chút để biến hóa cho mấy cái có sẵn đó, như vậy đảm bảo hơn.

jiSh @ n

@sacroyant: Nếu CSDL có nhiều user thì e là hơi phí dung lượng lưu trữ. Còn nói theo bác pcdinh thì chạy chậm 😀 dùng biến $AP trong hàm luôn chứ làm hằng tốn bộ nhớ 😀 Chênh lệch không bao nhiêu nhưng vẫn cứ so sánh cho bằng được 😀

Bàn thêm 1 cái về substr(md5(),8,16). md5 là unique, trong 1 chuỗi có 32 kí tự, sau đó tách ra còn 16 kí tự giữ, đối với md5, không bao giờ có trường hợp 16 kí tự đứng liền nhau, cùng vị trí lại trùng với chuỗi bị mã hóa khác. Các thuộc mã hóa 1 chiều cũng vậy. Còn bác xìpammờ muốn chừng minh nó bị trùng thì dùng toán học, thống kê và phân tích đi bác 😀 chứng mình là nó bị trùng đi bác 😀

Chuỗi MD5 sẽ unique khi nó là 1 chuỗi đầy đủ, bị cắt bớt thì ko ai đảm bảo (mình có nhớ nhầm ko nhỉ :bored:) Hash của bạn là một hàm hợp gồm 1 chuỗi các hàm unique (cứ cho là vậy đi), nhưng trong đó có 1 hàm bị nghi ngờ về tính unique thì cả chuỗi hàm vẫn sẽ bị nghi ngờ. Em ko đủ trình độ chứng minh nó trùng bằng toán, nhưng chắc là tạm đủ để đọc hiểu cái chứng minh nó ko trùng ạ.

conmalele

Em ko đủ trình độ chứng minh nó trùng bằng toán, nhưng chắc là tạm đủ để đọc hiểu cái chứng minh nó ko trùng ạ.
Không hiểu bác đang nói gì và đang biện minh cho vấn đề nào, pó tay 😀

noname.cpp

hàm băm đảm bảo xác suất trùng nhau khi mã hóa 2 chuỗi khác nhau là cực nhỏ chứ không phải không bao giờ trùng nhau. Và nếu tìm được 2 chuỗi có mã hóa trùng nhau bằng một thuật toán nào đó thì hàm băm đó đã bị phá.
Tôi tìm kiếm trên mạng thấy hàm băm MD5 đã có những thuật toán phá nó khá nhanh.

sub

Em coi thử hàm hash_algos nó có tới nhiêu đây:
[0] => md4
[1] => md5
[2] => sha1
[3] => sha256
[4] => sha384
[5] => sha512
[6] => ripemd128
[7] => ripemd160
[8] => whirlpool
[9] => tiger128,3
[10] => tiger160,3
[11] => tiger192,3
[12] => tiger128,4
[13] => tiger160,4
[14] => tiger192,4
[15] => snefru
[16] => gost
[17] => adler32
[18] => crc32
[19] => crc32b
[20] => haval128,3
[21] => haval160,3
[22] => haval192,3
[23] => haval224,3
[24] => haval256,3
[25] => haval128,4
[26] => haval160,4
[27] => haval192,4
[28] => haval224,4
[29] => haval256,4
[30] => haval128,5
[31] => haval160,5
[32] => haval192,5
[33] => haval224,5
[34] => haval256,5
Vậy theo các bác, xài cái nào thì ổn?

sacroyant

@sacroyant: Nếu CSDL có nhiều user thì e là hơi phí dung lượng lưu trữ. Còn nói theo bác pcdinh thì chạy chậm 😀 dùng biến $AP trong hàm luôn chứ làm hằng tốn bộ nhớ. Chênh lệch không bao nhiêu nhưng vẫn cứ so sánh cho bằng được 😀

Cảm ơn bác nhắc nhở. Thế thì tôi phải rút kinh nghiệm mới được 🙂

Bản XamppLite tôi đang dùng chạy PHP 5.05, khi gọi 1 số hàm trong list này (và cả list của bác pcdinh post lên hôm trước) thì nó báo lỗi. Cuối cùng chỉ có md5 và sha1 là được hỗ trợ. Vậy xin các bác cho biết phải thêm thư viện hay chỉnh chỗ nào trong php.ini để kích hoạt tất cả các thuật toán mã hóa đó ?

conmalele

Cảm ơn bác nhắc nhở. Thế thì tôi phải rút kinh nghiệm mới được 🙂

Bản XamppLite tôi đang dùng chạy PHP 5.05, khi gọi 1 số hàm trong list này (và cả list của bác pcdinh post lên hôm trước) thì nó báo lỗi. Cuối cùng chỉ có md5 và sha1 là được hỗ trợ. Vậy xin các bác cho biết phải thêm thư viện hay chỉnh chỗ nào trong php.ini để kích hoạt tất cả các thuật toán mã hóa đó ?

Thêm cái đó vào xem, trong ext: php_hash.dll

mr47http://www.php.net/manual/en/function.hash.php

Powered by vBulletin ® Version 4.2.0 Copyright © 2023 vBulletin Solutions, Inc. All rights reserved .

Về hàm md5 trong PHP [Archive] – Diễn Đàn Tin Học

Bài viết liên quan
Hotline 24/7: O984.666.352
Alternate Text Gọi ngay