Mã hóa mật khẩu ở phía máy khách [trùng lặp]


67
43
Đặng Quốc Quân
9 năm trước

Có thể trùng lặp:
Giới thiệu về hệ thống băm mật khẩu ở phía máy khách

Tôi phải bảo mật mật khẩu của người dùng trang web của tôi. Những gì tôi đã làm là sử dụng băm mã hóa MD5 ở phía máy chủ. Nhưng vấn đề là mật khẩu vẫn ở dạng văn bản đơn giản cho đến khi đến máy chủ, điều đó có nghĩa là mật khẩu có thể bị bắt bằng cách sử dụng giám sát lưu lượng. Vì vậy, những gì tôi muốn là sử dụng một cơ chế mã hóa / băm mật khẩu phía máy khách và gửi mật khẩu được mã hóa / băm. Bất cứ ai có thể cho biết cách để làm điều này là gì?

Hữu ích 67 Yêu thích 43 Chia sẻ Viết bình luận 5
Không hữu ích

MD5 không mã hóa. Một cái gì đó được mã hóa có thể được giải mã, theo định nghĩa

Hữu ích 29 · Không hữu ích · Trả lời 0

Hãy nhớ rằng MD5 cũng bị hỏng. Xem tại đây win.tue.nl/hashclash/rogue-ca có thể tạo cùng một MD5 với dữ liệu khác nhau

Hữu ích 3 · Không hữu ích · Trả lời 0

Đúng là Gareth. MD5 là thuật toán băm mật mã một chiều, nó không phải là mã hóa bởi vì như bạn đã nói đúng, nó không thể được giải mã bằng công thức. Nó chỉ có thể là lực lượng vũ phu tấn công hoặc kiểm tra đối với một bảng băm đã biết.

Hữu ích 0 · Không hữu ích · Trả lời 0

Có, và khi bạn lưu trữ băm MD5 (hoặc bất kỳ loại băm nào khác) của mật khẩu, đừng bao giờ quên sử dụng muối! ( owasp.org/index.php/Hashing_Java#Why_add_salt_.3F )

Hữu ích 0 · Không hữu ích · Trả lời 0

Nó không trùng lặp, câu hỏi khác là về Băm và câu hỏi này là về mã hóa. Tôi rất khác nhau mặc dù một số người không biết công nghệ đã đề xuất băm là giải pháp;

Hữu ích 0 · Không hữu ích · Trả lời 0

8 Trả lời


111
Đặng Phương Trà
9 năm trước

Điều này sẽ không an toàn và thật đơn giản để giải thích tại sao:

Nếu bạn băm mật khẩu ở phía máy khách và sử dụng mã thông báo đó thay vì mật khẩu, thì kẻ tấn công sẽ không thể tìm ra mật khẩu là gì.

Tuy nhiên, kẻ tấn công không cần tìm hiểu mật khẩu là gì, bởi vì máy chủ của bạn không mong đợi mật khẩu nữa - nó đang chờ mã thông báo. Và những kẻ tấn công không biết mã bởi vì nó được gửi qua HTTP không được mã hóa!

Bây giờ, có thể hack cùng một loại hình thức mã hóa thách thức / phản hồi, điều đó có nghĩa là cùng một mật khẩu sẽ tạo ra một mã thông báo khác nhau cho mỗi yêu cầu. Tuy nhiên, điều này sẽ yêu cầu mật khẩu được lưu trữ ở định dạng có thể giải mã trên máy chủ, một cái gì đó không lý tưởng, nhưng có thể là một sự thỏa hiệp phù hợp.

Và cuối cùng, bạn có thực sự muốn yêu cầu người dùng bật javascript trước khi họ có thể đăng nhập vào trang web của bạn không?

Trong mọi trường hợp, SSL không phải là một giải pháp đắt tiền hay đặc biệt khó thiết lập nữa

Hữu ích 111 Chia sẻ Viết bình luận 5
Không hữu ích

+1 để giải thích lý do tại sao ý tưởng về cơ bản là thiếu sót. SSL / TLS là đặt cược tốt nhất trong trường hợp này.

Hữu ích 28 · Không hữu ích · Trả lời 0

Không, kẻ tấn công không phải sử dụng trang đăng nhập. Biểu mẫu web cách xây dựng yêu cầu web để gửi đến máy chủ, nhưng đó không phải là cách duy nhất. Có rất nhiều cách để kết nối với máy chủ và tạo lại một yêu cầu như thể nó đang được thực hiện bởi một trình duyệt web

Hữu ích 12 · Không hữu ích · Trả lời 0

Có thể "hack cùng một loại thách thức / phản hồi" mà không cần lưu trữ mật khẩu ở định dạng có thể giải mã được trên máy chủ: xem xác thực http digest ( en.wikipedia.org/wiki/iêu / tools.ietf.org/html/rfc2617 # phần-3.3 ). RFC nói về điều đó: "Lưu ý rằng máy chủ HTTP thực sự không cần biết mật khẩu xóa văn bản của người dùng."

Hữu ích 4 · Không hữu ích · Trả lời 0

Đúng, điều này không bảo vệ máy chủ của bạn . Tuy nhiên, đó bảo vệ khách hàng của bạn (tức là người dùng hoặc khách hàng của bạn), IMHO cũng quan trọng như hầu hết người dùng có mật khẩu xấu và trên hết là thường sử dụng lại chúng. Do đó, họ tự mở tất cả các loại khai thác. IMO này thể hiện sự chỉ trích ở trên chứ không phải là tranh luận.

Hữu ích 4 · Không hữu ích · Trả lời 0

Ahh..có cơ chế mã hóa phía máy khách sẽ không phải là một giải pháp tốt ..

Hữu ích 3 · Không hữu ích · Trả lời 0

89
Phạm Dạ Thi
9 năm trước

Bạn cần một thư viện có thể mã hóa đầu vào của bạn ở phía máy khách và chuyển nó đến máy chủ ở dạng được mã hóa.

Bạn có thể sử dụng libs sau:

  • Mã hóa . Mã hóa không đối xứng giữa máy khách và máy chủ qua Javascript

Cập nhật sau 3 năm:

Cập nhật sau 4 năm (Wohoo!)

Vẫn không thuyết phục? Tôi cũng không :)

Hữu ích 89 Chia sẻ Viết bình luận 5
Không hữu ích

+1 vì là câu trả lời duy nhất ở đây thực sự cung cấp giải pháp cho những gì OP muốn (tức là mã hóa phía máy khách)

Hữu ích 8 · Không hữu ích · Trả lời 0

Thật không may, sử dụng mã hóa hoặc băm phía máy khách JavaScript sẽ khiến một hệ thống như vậy không an toàn . Xem: matasano.com/articles/javascript-cryptography

Hữu ích 4 · Không hữu ích · Trả lời 0

Chính xác những gì anh ấy cần, câu trả lời tốt.

Hữu ích 2 · Không hữu ích · Trả lời 0

Cảm ơn các bạn :) Tôi đã cố gắng để đưa ra quan điểm.

Hữu ích 2 · Không hữu ích · Trả lời 0

@Bruno, nghe có vẻ thú vị. Tôi đã không nghĩ về vấn đề đó.

Hữu ích 0 · Không hữu ích · Trả lời 0

40
Lý Hồng Ngân
9 năm trước

Tôi sẽ chọn giải pháp đơn giản này .

Tóm tắt nó:

  • Khách hàng "Tôi muốn đăng nhập"
  • Máy chủ tạo một số ngẫu nhiên #Svà gửi nó đến Máy khách
  • Khách hàng
    • đọc tên người dùng và mật khẩu được nhập bởi người dùng
    • tính toán hàm băm của mật khẩu, nhận h(pw)(đó là những gì được lưu trữ trong DB)
    • tạo ra một số ngẫu nhiên khác #C
    • nối h(pw) + #S + #Cvà tính toán hàm băm của nó, gọi nóh(all)
    • gửi đến máy chủ username, #Ch(all)
  • Máy chủ
    • lấy ra h(pw)'cho chỉ định username, từ DB
    • bây giờ nó có tất cả các yếu tố để tính toán h(all'), giống như Client đã làm
    • if h(all)= h(all')then h(pw)= h(pw)', gần như chắc chắn

Không ai có thể lặp lại yêu cầu đăng nhập như người dùng được chỉ định. #Sthêm một thành phần biến vào hàm băm, mỗi lần (nó là cơ bản). #Cthêm tiếng ồn trong đó.

Hữu ích 40 Chia sẻ Viết bình luận 5
Không hữu ích

Nó vẫn dễ bị tổn thương bởi một người đàn ông trong cuộc tấn công giữa. Không có SSL / TLS, nó sẽ không bao giờ được bảo mật 100%. Nếu bạn có thể đánh chặn các truy vấn cuối cùng chứa đựng username, #Ch(all)bạn chỉ cần gửi nó ở vị trí của khách hàng và bạn đã đăng nhập.

Hữu ích 9 · Không hữu ích · Trả lời 0

Không có gì ngăn cản người đàn ông ở giữa gửi cho bạn số riêng của họ, hoặc thậm chí phục vụ bạn mã javascript tùy chỉnh hoàn toàn khác nhau sẽ chỉ chuyển mật khẩu trong văn bản thuần túy. Nói một cách đơn giản, không có SSL, tất cả các nỗ lực chỉ làm xáo trộn dữ liệu cho một kiddie kịch bản thông thường. Tôi đồng ý rằng điều này vẫn còn tốt hơn là chỉ gửi văn bản đơn giản, nhưng đơn giản là không có cách nào để che giấu thông tin khỏi kẻ tấn công xác định trên kết nối HTTP.

Hữu ích 2 · Không hữu ích · Trả lời 0

Tôi phải nói rằng chủ đề này thật tuyệt vời Tôi rất hồi hộp và câu trả lời của bạn đang bị đánh giá thấp, tất nhiên là rất đơn giản giải thích một khái niệm cơ bản. Tôi đang có một tình huống tương tự như tác giả ban đầu và tôi muốn hỏi bạn vài điều về giải pháp của bạn.

Hữu ích 1 · Không hữu ích · Trả lời 0

Cảm ơn! Tôi nghĩ rằng cơ hội là rất thấp, nếu số ngẫu nhiên là đủ lớn. Chỉ cần một thay đổi tối thiểu trong chuỗi nguồn (trong trường hợp của chúng tôi, mỗi lần đăng nhập là 2 số ngẫu nhiên mới) sẽ tạo ra một hàm băm hoàn toàn khác nhau. Ngoài ra, hàm băm ngược rất khó nếu chuỗi nguồn không có trong từ điển. Nhưng có lẽ ai đó chuyên gia hơn tôi có thể giúp đỡ.

Hữu ích 1 · Không hữu ích · Trả lời 0

(Xin lỗi, tôi đã vô tình nhấn enter và xuất bản một bình luận không hoàn chỉnh) Cơ hội mà kẻ tấn công chặn #S bằng cách nào ... Tôi không biết có thể sử dụng thẻ mạng ở chế độ lăng nhăng hoặc nhân bản địa chỉ MAC và sau đó sử dụng địa chỉ MAC để giải mã h (tất cả) Ý tôi là anh ta sẽ có #S và vì #C trần trụi nên mật khẩu có thể bị băm.

Hữu ích 0 · Không hữu ích · Trả lời 0

12
Vũ Phương Quyên
9 năm trước

Loại bảo vệ này thường được cung cấp bằng cách sử dụng HTTPS , để tất cả thông tin liên lạc giữa máy chủ web và máy khách được mã hóa.

Các hướng dẫn chính xác về cách đạt được điều này sẽ phụ thuộc vào máy chủ web của bạn.

Tài liệu Apache có hướng dẫn cấu hình SSL HƯỚNG DẪN có thể giúp ích. (cảm ơn người dùng G. Qyy cho liên kết)

Hữu ích 12 Chia sẻ Viết bình luận 5
Không hữu ích

Tôi hoàn toàn đồng ý với các bạn, anh ta nên có kết nối SSL nhưng đó không phải là câu hỏi của anh ta. Câu hỏi của anh là "Làm cách nào để bảo mật mật khẩu qua kết nối không bảo mật?" Tôi nghĩ rằng cách thích hợp để trả lời một câu hỏi là thực sự trả lời câu hỏi giải thích tại sao đó là một ý tưởng tồi. Khi bạn chỉ nói với mọi người, "Đó là một ý tưởng tồi." họ ngừng nghe. Nhưng nếu bạn đưa cho họ sợi dây và sau đó giải thích tại sao treo cổ tự tử là một ý tưởng tồi họ có xu hướng lắng nghe vì họ không cảm thấy như bạn bỏ qua câu hỏi của họ.

Hữu ích 5 · Không hữu ích · Trả lời 0

@Mike SSL là một phần của cơ sở hạ tầng thiết yếu của web hiện nay. Nếu bạn không thể sử dụng SSL, bạn có một vấn đề về cơ sở hạ tầng cần khắc phục. Thực hiện một số bài hát và nhảy với mã hóa phía máy khách trong khi bỏ qua vấn đề cơ bản của lưu lượng văn bản đơn giản không giải quyết được gì. Như vậy, "nhận SSL" câu trả lời.

Hữu ích 3 · Không hữu ích · Trả lời 0

@Mike Anh ấy đã nói ở đâu vậy? Tôi không thể thấy nó trong bất kỳ chỉnh sửa hoặc bất kỳ bình luận nào.

Hữu ích 2 · Không hữu ích · Trả lời 0

Điều đó không nói rằng anh ta không thể sử dụng HTTPS, chỉ là hiện tại anh ta không

Hữu ích 2 · Không hữu ích · Trả lời 0

@dinesh Thêm HTTPS sẽ không yêu cầu làm lại chính trang web của bạn nếu có. Chỉ sử dụng mã, bạn có thể thêm một kiểm tra rất đơn giản để đảm bảo rằng bạn đang sử dụng HTTPS và chuyển hướng nếu không. Tùy thuộc vào phần mềm máy chủ bạn đang sử dụng, bạn có thể thực hiện điều đó trong chính cấu hình máy chủ để bạn không cần phải thay đổi mã của mình. Nhiều nhất bạn có thể cần thêm một trang chuyển hướng từ HTTP đến trang HTTPS của mình nhưng một lần nữa, điều đó có thể được xử lý trong cấu hình máy chủ. Điều đó được nói rằng không thể kiểm tra mã của bạn cho HTTPS.

Hữu ích 1 · Không hữu ích · Trả lời 0

10
Trần Phúc Nguyên
9 năm trước

Tôi đã liệt kê một JavaScript hoàn chỉnh để tạo MD5 ở phía dưới nhưng thực sự vô nghĩa khi không có kết nối an toàn vì nhiều lý do.

Nếu bạn MD5 mật khẩu và lưu MD5 đó trong cơ sở dữ liệu của bạn thì MD5 là mật khẩu. Mọi người có thể nói chính xác những gì trong cơ sở dữ liệu của bạn. Về cơ bản, bạn chỉ tạo mật khẩu thành một chuỗi dài hơn nhưng nó vẫn không an toàn nếu đó là những gì bạn đang lưu trữ trong cơ sở dữ liệu của mình.

Nếu bạn nói, "À tôi sẽ MD5 MD5" bạn đang thiếu điểm. Bằng cách xem lưu lượng truy cập mạng hoặc tìm trong cơ sở dữ liệu của bạn, tôi có thể giả mạo trang web của bạn và gửi MD5. Cấp điều này khó hơn rất nhiều so với việc chỉ sử dụng lại mật khẩu văn bản đơn giản nhưng nó vẫn là một lỗ hổng bảo mật.

Hầu hết tất cả mặc dù bạn không thể muối phía khách hàng băm mà không gửi muối qua mạng 'không được mã hóa do đó làm cho việc muối trở nên vô nghĩa. Nếu không có muối hoặc với một loại muối đã biết, tôi có thể vũ phu tấn công hàm băm và tìm ra mật khẩu là gì.

Nếu bạn định làm điều này với việc truyền không được mã hóa, bạn cần sử dụng kỹ thuật mã hóa khóa chung / khóa riêng . Máy khách mã hóa bằng khóa chung của bạn sau đó bạn giải mã ở đầu bằng khóa riêng sau đó bạn MD5 mật khẩu (sử dụng muối duy nhất của người dùng) và lưu trữ trong cơ sở dữ liệu của bạn. Đây là một thư viện khóa công khai / riêng tư JavaScript .

Dù sao , đây là mã JavaScript để tạo phía máy khách MD5 (không phải mã của tôi):

/**
*
*  MD5 (Message-Digest Algorithm)
*  http://www.webtoolkit.info/
*
**/

var MD5 = function (string) {

    function RotateLeft(lValue, iShiftBits) {
        return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
    }

    function AddUnsigned(lX,lY) {
        var lX4,lY4,lX8,lY8,lResult;
        lX8 = (lX & 0x80000000);
        lY8 = (lY & 0x80000000);
        lX4 = (lX & 0x40000000);
        lY4 = (lY & 0x40000000);
        lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
        if (lX4 & lY4) {
            return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
        }
        if (lX4 | lY4) {
            if (lResult & 0x40000000) {
                return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
            } else {
                return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
            }
        } else {
            return (lResult ^ lX8 ^ lY8);
        }
    }

    function F(x,y,z) { return (x & y) | ((~x) & z); }
    function G(x,y,z) { return (x & z) | (y & (~z)); }
    function H(x,y,z) { return (x ^ y ^ z); }
    function I(x,y,z) { return (y ^ (x | (~z))); }

    function FF(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function GG(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function HH(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function II(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function ConvertToWordArray(string) {
        var lWordCount;
        var lMessageLength = string.length;
        var lNumberOfWords_temp1=lMessageLength + 8;
        var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
        var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
        var lWordArray=Array(lNumberOfWords-1);
        var lBytePosition = 0;
        var lByteCount = 0;
        while ( lByteCount < lMessageLength ) {
            lWordCount = (lByteCount-(lByteCount % 4))/4;
            lBytePosition = (lByteCount % 4)*8;
            lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
            lByteCount++;
        }
        lWordCount = (lByteCount-(lByteCount % 4))/4;
        lBytePosition = (lByteCount % 4)*8;
        lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
        lWordArray[lNumberOfWords-2] = lMessageLength<<3;
        lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
        return lWordArray;
    };

    function WordToHex(lValue) {
        var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
        for (lCount = 0;lCount<=3;lCount++) {
            lByte = (lValue>>>(lCount*8)) & 255;
            WordToHexValue_temp = "0" + lByte.toString(16);
            WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
        }
        return WordToHexValue;
    };

    function Utf8Encode(string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    };

    var x=Array();
    var k,AA,BB,CC,DD,a,b,c,d;
    var S11=7, S12=12, S13=17, S14=22;
    var S21=5, S22=9 , S23=14, S24=20;
    var S31=4, S32=11, S33=16, S34=23;
    var S41=6, S42=10, S43=15, S44=21;

    string = Utf8Encode(string);

    x = ConvertToWordArray(string);

    a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;

    for (k=0;k<x.length;k+=16) {
        AA=a; BB=b; CC=c; DD=d;
        a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
        d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
        c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
        b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
        a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
        d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
        c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
        b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
        a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
        d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
        c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
        b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
        a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
        d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
        c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
        b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
        a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
        d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
        c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
        b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
        a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
        d=GG(d,a,b,c,x[k+10],S22,0x2441453);
        c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
        b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
        a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
        d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
        c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
        b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
        a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
        d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
        c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
        b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
        a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
        d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
        c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
        b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
        a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
        d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
        c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
        b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
        a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
        d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
        c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
        b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
        a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
        d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
        c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
        b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
        a=II(a,b,c,d,x[k+0], S41,0xF4292244);
        d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
        c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
        b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
        a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
        d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
        c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
        b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
        a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
        d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
        c=II(c,d,a,b,x[k+6], S43,0xA3014314);
        b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
        a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
        d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
        c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
        b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
        a=AddUnsigned(a,AA);
        b=AddUnsigned(b,BB);
        c=AddUnsigned(c,CC);
        d=AddUnsigned(d,DD);
    }

    var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);

    return temp.toLowerCase();
}
Hữu ích 10 Chia sẻ Viết bình luận 5
Không hữu ích

@deceze Cảm ơn bạn đã trả lời và bạn đã đúng. Tôi cho rằng anh ta không thể làm SSL vì anh ta nói anh ta không sử dụng nó. Lỗi của tôi. Không bao giờ đau lòng khi nhìn vào chính mình khi đánh giá người khác.

Hữu ích 4 · Không hữu ích · Trả lời 0

Cảm ơn rất nhiều Mike.

Hữu ích 0 · Không hữu ích · Trả lời 0

Không vấn đề gì. Đó là một tiểu thú cưng của tôi khi mọi người không trả lời một câu hỏi, ngay cả khi câu trả lời là một ý tưởng tồi. Tôi thậm chí đã viết một bài đăng trên blog về nó: picklepumpers.com/wordpress/?p=673

Hữu ích 0 · Không hữu ích · Trả lời 0

@Mike Xin vui lòng cho tôi biết rằng bạn đang phát cuồng vì thiếu kỹ năng giao tiếp, nhưng hoàn toàn hiểu sai các yêu cầu và kiến ​​thức của OP về SSL. Giao tiếp của con người là một điều cực kỳ sai lầm và dễ vỡ, kỹ năng giao tiếp cần phải đi cả hai chiều. :)

Hữu ích 0 · Không hữu ích · Trả lời 0

+1 cho nội tâm xây dựng. : o)

Hữu ích 0 · Không hữu ích · Trả lời 0

5
Vũ Mai Tâm
9 năm trước

Bạn đã gắn thẻ câu hỏi này bằng thẻ và SSL là câu trả lời. Hiếu kỳ.

Hữu ích 5 Chia sẻ Viết bình luận 0
Không hữu ích

4
Trần Nhã Sương
9 năm trước

Bạn cũng có thể chỉ cần sử dụng xác thực http với Digest ( Dưới đây một số infos nếu bạn sử dụng Apache httpd , Apache Tomcat , và ở đây giải thích về tiêu hóa ).

Với Java, để biết thông tin thú vị, hãy xem:

Hữu ích 4 Chia sẻ Viết bình luận 5
Không hữu ích

Đối với tôi, Digest có thể thú vị bởi vì bạn không phải thao túng chứng chỉ, đó là rất nhiều công việc và / hoặc tiền): trả tiền cho một CA phê duyệt hoặc triển khai chứng chỉ CA của bạn trên máy khách của bạn và nó làm quá tải máy chủ của bạn ( mật mã là một chi phí cho bộ xử lý của bạn). trung bình 1 máy khách SSL có giá 10 máy khách không SSL cho tải máy chủ của bạn. NHƯNG Digest không mã hóa bất cứ điều gì! tất cả các dữ liệu khác được trao đổi qua mạng giữa máy khách và máy chủ đều rõ ràng. Sự phức tạp của việc thực hiện không phải là mối lo ngại chính của bạn, mà là mức độ bảo mật của dữ liệu bạn thao tác.

Hữu ích 1 · Không hữu ích · Trả lời 0

Cảm ơn. Điều gì dễ thực hiện hơn, HTTPS hoặc HTTP Digest?

Hữu ích 0 · Không hữu ích · Trả lời 0

Có chứng chỉ nào liên quan đến cơ chế HTTP Digest như trong HTTPS không?

Hữu ích 0 · Không hữu ích · Trả lời 0

Nó phụ thuộc. HTTPS và Digest có thể bổ sung cho nhau. Digest chỉ là một phương pháp để xác thực ứng dụng khách và kiểm tra anh ta có mật khẩu tốt mà không cần trao đổi mật khẩu giữa máy chủ và máy khách trong văn bản rõ ràng qua mạng. Điều này không cần chứng chỉ, vì nó không mã hóa gì và không sử dụng bất kỳ loại mật mã bất đối xứng nào. Máy chủ chỉ thách thức khách hàng với các công cụ mã hóa (như MD5) để kiểm tra. Nếu bạn xem trong liên kết "Tìm hiểu xác thực đăng nhập" ( download.oracle.com/javaee/1.4/tutorial/doc/Security5.html ) bạn sẽ dễ dàng xử lý hơn ^^

Hữu ích 0 · Không hữu ích · Trả lời 0

@dinesh: không có chứng nhận cho HTTP Digest. Xác thực Digest đơn giản hơn để thực hiện, nhưng 1) bạn không thể cung cấp hình thức đăng nhập đẹp cho người dùng của mình, 2) nó chỉ giải quyết được phần xác thực, nhưng nó không bảo vệ dữ liệu được chuyển (SSL không).

Hữu ích 0 · Không hữu ích · Trả lời 0

2
Tạ Thơ Thơ
9 năm trước

Có thư viện MD5 có sẵn cho javascript. Hãy nhớ rằng giải pháp này sẽ không hoạt động nếu bạn cần hỗ trợ người dùng không có javascript.

Giải pháp phổ biến hơn là sử dụng HTTPS. Với HTTPS, mã hóa SSL được thỏa thuận giữa máy chủ web của bạn và máy khách, mã hóa trong suốt tất cả lưu lượng truy cập.

Hữu ích 2 Chia sẻ Viết bình luận 3
Không hữu ích

@MikeBethany Ông nói không có điều đó, trong câu trả lời của ông hoặc bất cứ nơi nào khác.

Hữu ích 1 · Không hữu ích · Trả lời 0

Anh ta không thể sử dụng HTTPS. Ông nói như vậy trong câu trả lời của mình.

Hữu ích 0 · Không hữu ích · Trả lời 0

Máy chủ giải mã mã hóa SSL - biến văn bản bị cắt xén trở lại thành văn bản thuần túy. Chắc chắn, SSL giúp bạn tránh khỏi những con mắt tò mò trong ether, nhưng không ngăn máy chủ lấy mật khẩu bằng văn bản thuần túy.

Hữu ích 0 · Không hữu ích · Trả lời 0

Trả lời của bạn

Xem trước nội dung