<![CDATA[Latest posts for the topic "Các cách xác thực người dùng bằng mật khẩu "]]> /hvaonline/posts/list/8.html JForum - http://www.jforum.net Các cách xác thực người dùng bằng mật khẩu

Protocol 1 wrote:
1. User gửi (ID, P) cho Host, trong đó P là plaintext password của User 2. Căn cứ vào ID, Host lấy từ database ra A, là một biến thể của password của User và salt, là một chuỗi ngẫu nhiên gắn liền với ID của user. Host thực hiện một phép tính trên P (thông thường là B = H(P, salt), trong đó H là một hàm băm một chiều nào đó) để tính ra B, rồi so sánh A với B, nếu bằng nhau thì tiếp theo bước 3, không thì tiếp theo bước 4. 3. User được Host xác thực và cấp cho một session_id. 4. Host thông báo lỗi cho User, và yêu cầu làm lại từ bước 1.  
Protocol này có những vấn đề gì? Mình thử làm xem nha: vấn đề lớn nhất là plaintext password của User bị truyền đi mà không có bất kỳ sự bảo vệ nào. Nhiều bạn sẽ tranh luận là nếu dùng HTTPS thì sẽ không sao, nhưng như mình đã nói ngay từ đầu, giả thuyết đường truyền luôn có người theo dõi là một giả thuyết cần thiết trong môi trường Internet nhiều nguy cơ và phức tạp như bây giờ. Ví dụ như vừa rồi, ở BlackHat có người làm một cái demo ssl-mitm. Câu hỏi là: sửa protocol của HVAOnline lại thế nào để giải quyết được vấn đề plaintext password này? Mình thử revise lại một chút, ra một protocol như sau:

Protocol 2 wrote:
1. User gửi ID cho Host. 2. Host lấy từ database ra salt của ID, và gửi lại cho User. 3. User thực hiện A = H(P, salt), rồi gửi A cho Host. 4. Host lấy từ database ra B (cũng là B được tính như ở protocol 1) so sánh A và B, nếu bằng nhau thì tiếp tục bước 5, không bằng thì tiếp tục bước 6. 5. User được Host xác thực và cấp cho một session_id. 6. Host thông báo lỗi cho User, và yêu cầu làm lại từ bước 1.  
Protocol 2 này giải quyết được (một phần) vấn đề plaintext password được truyền trên đường truyền. Và trên Internet cũng có nhiều website thưc hiện cái protocol 2 này để xác thực người dùng. Câu hỏi là: protocol 2 này có những vấn đề gì? Mình cũng đưa ra đây lại protocol mà MrNothing đề xuất:

Protocol 3 wrote:
1. User gửi ID, C1 = E(P, nonce1) cho Host, trong đó P là mật khẩu của User, nonce là unique message number, thường là random, E(K, M) là symmetric cipher nhận key là K và plaintext là M. 2. Host lấy từ database ra P của ID, rồi thực hiện nonce1' = D(P, C1). Host tính C2 = E(P, nonce1'||nonce2||session_key), trong đó || nghĩa là nối vào, nonce2 và session_key được Host tạo ra ngẫu nhiên. Host gửi lại C2 cho User. 3. User thực hiện X = D(P, C2). Căn cứ vào thoả thuận trước về chiều dài của nonce, mà User sẽ cắt ra nonce1' từ X, rồi so sánh nonce1' với nonce1, nếu không bằng nhau, thì nhảy đến bước 6. Nếu bằng nhau, User sẽ cắt nonce2' và session_key' từ X ra, rồi thực hiện C3 = E(session_key', nonce2'). User gửi C3 lại cho Host. 4. Host thực hiện C4 = E(session_key, nonce2), so sánh C4 và C3, nếu không bằng nhau thì nhảy đến bước 6, nếu bằng nhau thì nhảy đến bước 5. 5. User được Host xác thực và cấp cho một session_id. 6. Host thông báo lỗi cho User, và yêu cầu làm lại từ bước 1.  
Câu hỏi vẫn là: Protocol 3 này có những vấn đề gì? Mời các bạn phân tích các protocol này cho vui. Hoặc là mô tả protocol mà bạn đang sử dụng để mọi người tham khảo, nhất là các bạn lập trình viên đó. PS: mặc dù đã có nhiều protocol hay hơn, nhưng mình nghĩ cứ từng bước đã, tìm hiểu những vấn đề của các protocol đang được bạn sử dụng, thì từ đó mới có thể xây dựng các protocl khác an toàn hơn.]]>
/hvaonline/posts/list/28909.html#178192 /hvaonline/posts/list/28909.html#178192 GMT
Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#178207 /hvaonline/posts/list/28909.html#178207 GMT Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#178221 /hvaonline/posts/list/28909.html#178221 GMT Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#178222 /hvaonline/posts/list/28909.html#178222 GMT Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#178224 /hvaonline/posts/list/28909.html#178224 GMT Re: Các cách xác thực người dùng bằng mật khẩu Code:
Host lưu trong database H_usr = H(P || salt) & salt.
Code:
1. User gửi ID.

2. Host sinh nonce, gửi cho client. nonce || salt.

3. Client gửi lại X = H( H(P || salt) || nonce).

4. Host tính X1 = H(H_usr || nonce) và so sánh với X. Nếu giống nhau tiếp tục bước 5. Nếu sai chuyển sang bước 7.

5. Host gửi cho user một session_id. M = E(H_usr || nonce ,session_id). 

6. User nhận được M, giải mã lấy ra session_id = D( H(P||salt) || nonce, M).

7. Host thông báo lỗi cho usr, yêu cầu làm lại.
]]>
/hvaonline/posts/list/28909.html#178226 /hvaonline/posts/list/28909.html#178226 GMT
Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#178229 /hvaonline/posts/list/28909.html#178229 GMT Re: Các cách xác thực người dùng bằng mật khẩu

MrNothing wrote:
Protocol 2 dùng salt như kiểu challenge theo kiểu one time password. 
Salt chứ không phải nonce bạn ạ.

mfeng wrote:
@starghost: tớ chưa hiểu ở protocol 3 mà không có mutual authentication thì sẽ bị nguy cơ gì? Bên client và server xác lập sự tin cậy dựa trên một share secret (là password). Giả sử rằng password này không để bên thứ ba biết, thì protocol 3 đã đảm bảo an toàn rồi. 
Về mặt nguyên tắc, nắm được password của user không có nghĩa là chứng minh được đó là cái honest server, vì password là thứ dễ bị externalized nhất. Nói đến mutual authentication thì cách thức duy nhất được chấp nhận hiện nay là dùng public key cryptosystem.

mfeng wrote:
PS: Web cũng dùng được chứ nhỉ? Tớ thấy AJAX có thể hỗ trợ cái này đấy chứ ? 
À cái này thì hiển nhiên, chỉ có điều khó mà standardize được, tức là mỗi website nếu muốn thực hiện thì phải tự implement lấy, chứ không phải như trường hợp của TLS. Còn trong môi trường e-commerce thì hiển nhiên là không chấp nhận được. ]]>
/hvaonline/posts/list/28909.html#178235 /hvaonline/posts/list/28909.html#178235 GMT
Re: Các cách xác thực người dùng bằng mật khẩu

MrNothing wrote:
Xét protocol 4: lưu dãy H_user+ salt thì có đổ vỡ không? Như nhau thôi. ai có P thì cũng sinh ra được dãy H(P||salt). Ai có H(P||salt) thì cũng xác thực được client.  
Khác chứ, người dùng thường có xu hướng dùng chung password cho nhiều hệ thống, một hệ thống để lộ pass của người dùng thì không được ảnh hưởng tới hệ kia :D

StarGhost wrote:
Về mặt nguyên tắc, nắm được password của user không có nghĩa là chứng minh được đó là cái honest server, vì password là thứ dễ bị externalized nhất. Nói đến mutual authentication thì cách thức duy nhất được chấp nhận hiện nay là dùng public key cryptosystem.  
Theo tớ thấy thì ngay cả cert dùng pub/privkey cũng có thể bị mất, có điều khó mất hơn password thôi: vì attacker sẽ phải nắm được "cái ta có" (là privkey) và "cái ta biết" (là passphrase). Tóm lại chúng ta đang thảo luận về xác bằng mật khẩu sao cho an toàn, nghĩa là hệ thống hoạt động dựa trên một điểm tin cậy nào đó (ở đây là mật khẩu). Với pubkey cryptosystem, điểm tin cậy là pub/privkey là câu chuyện khác. ]]>
/hvaonline/posts/list/28909.html#178237 /hvaonline/posts/list/28909.html#178237 GMT
Re: Các cách xác thực người dùng bằng mật khẩu

StarGhost wrote:
Về mặt nguyên tắc, nắm được password của user không có nghĩa là chứng minh được đó là cái honest server, vì password là thứ dễ bị externalized nhất. Nói đến mutual authentication thì cách thức duy nhất được chấp nhận hiện nay là dùng public key cryptosystem.  
Public Key thì an toàn hơn là đúng rồi. Ai muốn giả mạo cần có cả Private Key và password để open nó. + Làm thế nào để chôm được private key + làm thế nào để có password Chi phí cho public key là khá lớn. Không thể bảo ai cũng kè kè cái usb được! và phiền toái khi sử dụng ở các máy khác nhau. Nếu chỉ dùng trên máy mình thì có thể lưu ở máy.

StarGhost wrote:
À cái này thì hiển nhiên, chỉ có điều khó mà standardize được, tức là mỗi website nếu muốn thực hiện thì phải tự implement lấy, chứ không phải như trường hợp của TLS. Còn trong môi trường e-commerce thì hiển nhiên là không chấp nhận được.  
Với ecommerce thì giờ em thấy họ có ít nhất 3 thứ: 1. Public key (lưu ở usb) 2. Password 3. One Time Password (Một số dùng một miếng giấy in 35 pass rồi mỗi lần giao dịch nó sẽ hỏi, một số dùng Token của RSA, Entrust, Gemato, một số thì chơi kiểu gửi TAN tới máy di động qua SMS. Có vụ đang thu mua Nokia 1100 của Đức cho để ăn cắp TAN thì phải :). ]]>
/hvaonline/posts/list/28909.html#178239 /hvaonline/posts/list/28909.html#178239 GMT
Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#178240 /hvaonline/posts/list/28909.html#178240 GMT Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#178241 /hvaonline/posts/list/28909.html#178241 GMT Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#178244 /hvaonline/posts/list/28909.html#178244 GMT Re: Các cách xác thực người dùng bằng mật khẩu

mfeng wrote:
Theo tớ thấy thì ngay cả cert dùng pub/privkey cũng có thể bị mất, có điều khó mất hơn password thôi: vì attacker sẽ phải nắm được "cái ta có" (là privkey) và "cái ta biết" (là passphrase). Tóm lại chúng ta đang thảo luận về xác bằng mật khẩu sao cho an toàn, nghĩa là hệ thống hoạt động dựa trên một điểm tin cậy nào đó (ở đây là mật khẩu). Với pubkey cryptosystem, điểm tin cậy là pub/privkey là câu chuyện khác.  
--> Không phải là khó mất hơn, mà là khó mất hơn rất nhiều, vì private key là thứ hầu như không bao giờ bị externalized. Hơn nữa, security assumptions cũng mạnh hơn rất nhiều.

MrNothing wrote:
Với ecommerce thì giờ em thấy họ có ít nhất 3 thứ: 1. Public key (lưu ở usb) 2. Password 3. One Time Password (Một số dùng một miếng giấy in 35 pass rồi mỗi lần giao dịch nó sẽ hỏi, một số dùng Token của RSA, Entrust, Gemato, một số thì chơi kiểu gửi TAN tới máy di động qua SMS. Có vụ đang thu mua Nokia 1100 của Đức cho để ăn cắp TAN thì phải smilie.  
Đấy là user authentication thôi, còn server authentication thì chỉ có PKI vậy.

MrNothing wrote:
@ mfeng: nếu password của bạn 10 kí tự là bị lộ rồi đấy. Không cần tấn công host chỉ cần vét cạn thôi!  
Chà, 10 kí tự mà bạn vét cạn được thì bạn cũng có kha khá resource đấy nhỉ. :P ]]>
/hvaonline/posts/list/28909.html#178249 /hvaonline/posts/list/28909.html#178249 GMT
Re: Các cách xác thực người dùng bằng mật khẩu

MrNothing wrote:
out of band authentication: khi đó thêm 1 số bí mật nữa được truyền bằng con đường khác, email, sms,... Khi đó muốn giả mạo thì cần tấn công cả 2 kênh truyền. Em nghĩ là thêm giả thuyết là database của 2 bên không bị tấn công. Password không bị mất theo kiểu camera theo dõi nhập số, key logger,... Các giao thức nêu trên vẫn lộ pass, nó cho phép attacker có cơ chế để verify pass đúng hay sai bằng các message nó tóm được mà không cần tấn công để lấy password trên host hoặc client. Trừ khi password đủ dài! choc_ có link của ssl-mitm ko? hình như đây có: http://blog.renchap.com/2009/02/20/blackhat-presentation-about-ssl-mitm 
Giả sử có một super douper computer có thể brute một chuỗi hash trong vòng một thời gian cực ngắn (từ 1 năm xuống còn vài phút - quantum physics) thì mọi biện pháp chống chọi nào không ngăn được mitm thì cũng... hỏng. Nếu có "out-of-band" factor dính vào thì việc detect cái "out-of-band" ấy không đơn giản và để đạt được mục đích mitm trong cái "out-of-band" ấy sẽ trở nên khó hơn nữa. Nếu "out-of-band" có nhiều factors con nữa thì lại gia tăng mức bảo mật. Nói tóm lại, mọi sự quy về cái gọi là "cost of implementation" :P ]]>
/hvaonline/posts/list/28909.html#178251 /hvaonline/posts/list/28909.html#178251 GMT
Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#178259 /hvaonline/posts/list/28909.html#178259 GMT Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#178278 /hvaonline/posts/list/28909.html#178278 GMT Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#178279 /hvaonline/posts/list/28909.html#178279 GMT Re: Các cách xác thực người dùng bằng mật khẩu

mfeng wrote:
Topic phát triển nhanh quá! Mới từ xác thực bằng mật khẩu đã chuyển sang public key & out-of-band authentication rồi :) 
Hì hì, vậy tốt chớ sao em :P . Có những chi tiết có thể tự "khai thác" sau (tài liệu có cả đống mà). Cái chính là đi đến những giải pháp tổng thể sau khi xác định được hạn chế nhất định nào đó.]]>
/hvaonline/posts/list/28909.html#178296 /hvaonline/posts/list/28909.html#178296 GMT
Re: Các cách xác thực người dùng bằng mật khẩu Code:
Protocol 5:

1. Alice tạo cặp khóa Public Key  (PR,PU) . Alice gửi M1=E(pw, PU) tới Bob.
2. Bob giải mã M1. Tạo M2= E(PU,sk||nonce) gửi lại Alice
3. Alice gửi E(sk,nonce) cho Bob.
Chi phí tính toán hơi lớn! Đổi lại là an toàn hơn :) Thà chia sẻ xừ Public Key từ đầu cho xong :D.]]>
/hvaonline/posts/list/28909.html#178318 /hvaonline/posts/list/28909.html#178318 GMT
Re: Các cách xác thực người dùng bằng mật khẩu

MrNothing wrote:
có giải thuật nào nữa không ạ? Code:
Protocol 5:

1. Alice tạo cặp khóa Public Key  (PR,PU) . Alice gửi M1=E(pw, PU) tới Bob.
2. Bob giải mã M1. Tạo M2= E(PU,sk||nonce) gửi lại Alice
3. Alice gửi E(sk,nonce) cho Bob.
Chi phí tính toán hơi lớn! Đổi lại là an toàn hơn :) Thà chia sẻ xừ Public Key từ đầu cho xong :D. 
Bạn ơi, public key mà bạn làm như private message thế này thì hỏng bét. Protocol này phải sửa lại thôi.]]>
/hvaonline/posts/list/28909.html#178334 /hvaonline/posts/list/28909.html#178334 GMT
Re: Các cách xác thực người dùng bằng mật khẩu Code:
bịa ra giải thuật (custom protocol)
==> chống dịch ngược để lấy giải thuật :)]]>
/hvaonline/posts/list/28909.html#178352 /hvaonline/posts/list/28909.html#178352 GMT
Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#178573 /hvaonline/posts/list/28909.html#178573 GMT Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#178589 /hvaonline/posts/list/28909.html#178589 GMT Re: Các cách xác thực người dùng bằng mật khẩu MrNothing: ở step 1 không biết key pair được tạo ra như thế nào và có hiệu lực ra sao? Còn nữa, mình tò mò không biết protocol này có phải hoàn toàn do bạn tự nghĩ ra chăng? p/s: Nếu mình đoán không nhầm về ý tưởng của bạn MrNothing đưa ra thì protocol 5 có một đặc điểm rất hay mà các protocol khác không có được. Tuy nhiên, nếu bạn nào có ý định implement protocol này thì cũng nên tìm hiểu xem tại sao nó lại chưa bao giờ được sử dụng một cách phổ biến.]]> /hvaonline/posts/list/28909.html#181314 /hvaonline/posts/list/28909.html#181314 GMT Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#181318 /hvaonline/posts/list/28909.html#181318 GMT Re: Các cách xác thực người dùng bằng mật khẩu

MrNothing wrote:
Ở Step 1 bạn StarGhost băn khoăn là làm sao Bob hiểu thông tin gì chứa trong PU. Alice và Bob dùng chung một cơ chế giải thuật đã thông báo từ trước chẳng hạn. Nếu thiết kế PU không tốt thì sẽ lộ pass. Ví dụ không nên gửi E(pw, X,PU) với X là một thông tin mà attacker có thể biết như timestamp, ID của Alice hoặc Bob vì khi đó Attacker có thể vét cạn pw để tìm ra pw. 
Hì mình không có hỏi như vậy. Nhưng mà bạn nói protocol ra đời cách đây 17 năm thì mình rõ rồi. Thực ra trong authentication thì độ phức tạp tính toán không phải hoàn toàn là cái gì quá critical, nếu vì mất thêm một chút tính toán mà tăng thêm security thì tội gì không. Protocol này hay ở chỗ entropy của các messages không phụ thuộc vào password. Thế nên không quan trọng password dài ngắn ra sao, việc bruteforce password là không thể.]]>
/hvaonline/posts/list/28909.html#181321 /hvaonline/posts/list/28909.html#181321 GMT
Re: Các cách xác thực người dùng bằng mật khẩu Code:
Protocol 5:
 
 1. Alice tạo cặp khóa Public Key  (PR,PU) . Alice gửi M1=E(pw, PU) tới Bob.
 2. Bob giải mã M1. Tạo M2= E(PU,sk||nonce) gửi lại Alice
 3. Alice gửi E(sk,nonce) cho Bob.
Mục tiêu của giao thức authentication này diễn ra giữa user và server. Ở đây Alice là user, Bob là server có phải không ?. Vì có trước giả thiết là: - Hai đầu cuối (usr & server) là tin cậy, không có khả năng bị compromised. - Đường truyền bị theo dõi & có khả năng bị replay. Nêu mọi thảo luận sẽ nằm ở an toàn của thông tin trao đổi trên đường truyền chứ không phải thông tin cần lưu trữ, mặc dù điều này khá quan trọng khi cài đặt một giao thức xác thực. Câu hỏi: - Step2: Làm sao Bob giải mã được M1 khi không biết thông điệp M1 được gửi từ Alice1 hay Alice2 ? - Giao thức trên sinh Pub/Priv key, rồi dùng pre-shared password để gửi Pubkey, sau đó dùng lại PubKey để trao đổi session key. Cách làm trên ưu điểm hơn gì so với dùng luôn password để trao đổi session key?. Và vấn đề gì sẽ xảy ra khi mỗi lần gửi đi các PubKey đều dùng lại một key để mã hóa ? Nhìn chung protocol 5 có vẻ giống một key exchange protocol hơn là một authentication protocol.

Starghost wrote:
Protocol này hay ở chỗ entropy của các messages không phụ thuộc vào password. Thế nên không quan trọng password dài ngắn ra sao, việc bruteforce password là không thể.  
Protocol này có sử dụng password làm key để mã hóa PubKey, thức là có phụ thuộc vào password chứ nhỉ :). Nếu xét về khả năng bruteforce M1 thì tại sao lại không có ?]]>
/hvaonline/posts/list/28909.html#181340 /hvaonline/posts/list/28909.html#181340 GMT
Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#181342 /hvaonline/posts/list/28909.html#181342 GMT Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#181346 /hvaonline/posts/list/28909.html#181346 GMT Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#181396 /hvaonline/posts/list/28909.html#181396 GMT Re: Các cách xác thực người dùng bằng mật khẩu

MrNothing wrote:
1. Lấy pass qua con đường khác thì thôi khỏi nói smilie, chết chắc rồi 2. Nếu mất pass thì chỉ lộ PU, chứ không lộ PR. 3. Đồng ý. Biết session key sk và nonce thì chỉ việc vét cạn pw tìm xem PU nào tương ứng có E(PU_dự_đoán,sk||nonce)= E(PU_thật,sk||nonce), tuy nhiên kiểu gì chả có cơ chế vượt qua cái này, sửa protocol 5 một tí là xong.  
1. Đâu có bạn, strong password protocol thì phải giải quyết được vấn đề verifier không phải lưu trữ plaintext-equivalent password. Vẫn có protocol làm được đó, bất chấp nhìn vào database của verifier cũng không thể tìm được password. Thậm chí mục tiêu họ đặt ra còn là thứ mà verifier lưu trữ là thông tin public luôn. Mình không nhớ là có protocol nào làm được hay không. 2. mất password thì ở bước 1 và bước 2, attacker đã có thể lấy được session key của những session trước đó. mình không nói là mất PU hay PK. một protocol tốt là protocol phải đảm bảo được tính forward secrecy, nghĩa là có mất password hay một cái long-term shared-key nào đó thì attacker vẫn không learn được gì ở các session trong quá khứ. 3. sửa thế nào? ]]>
/hvaonline/posts/list/28909.html#181398 /hvaonline/posts/list/28909.html#181398 GMT
Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#181399 /hvaonline/posts/list/28909.html#181399 GMT Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#181402 /hvaonline/posts/list/28909.html#181402 GMT Re: Các cách xác thực người dùng bằng mật khẩu

mrro wrote:
1. Đâu có bạn, strong password protocol thì phải giải quyết được vấn đề verifier không phải lưu trữ plaintext-equivalent password. Vẫn có protocol làm được đó, bất chấp nhìn vào database của verifier cũng không thể tìm được password. Thậm chí mục tiêu họ đặt ra còn là thứ mà verifier lưu trữ là thông tin public luôn. Mình không nhớ là có protocol nào làm được hay không.  
1. Theo tớ hiểu ý bạn bạn nói đến cái dùng để xác thực có thể được public, thì phải khó tạo ra cái cần được xác thực. Tớ thấy nó cơ chế có vẻ giống với public key! Như kiểu server lưu PU, client có PR ấy nhỉ?

mrro wrote:
Vẫn có protocol làm được đó, bất chấp nhìn vào database của verifier cũng không thể tìm được password  
Có ví dụ cho cái này không mrro?Cơ chế cho nó là gì nhỉ? 3. Bob tạo ra PU_Bob nữa :D. Code:
1. Alice tạo (PR_Alice,cPU_Alice), và gửi Bob:M1= Symmetric_encryption(pw,PU_Alice)
2. Bob tạo (PR_Bob, PU_Bob), và gửi Alice: M2= Asymmetric_encryption(PU_Alice, PU_Bob)
3. Alice gửi Bob: M3=Asymmetric_encryption(PU_Bob, sk||nonce)
4. Bob gửi Alice: M4=Symmetric_encryption(sk,nonce)
@mrro: đã sửa]]>
/hvaonline/posts/list/28909.html#181403 /hvaonline/posts/list/28909.html#181403 GMT
Re: Các cách xác thực người dùng bằng mật khẩu

MrNothing wrote:
1. Verifier lưu trữ là thông tin public luôn giả sử nó là U. Giả sử attacker có giải thuật verify+ cái verify lưu trữ. Thế thì vấn đề sẽ là khó có thể tạo ra cái được nào được verify bới verifier và U. Nguyên lý này giống hàm một chiều nhỉ? Lại thành hệ Public Key rồi.  
@MrNothing: có vẻ bạn ít bao giờ tự đọc lại bài viết của mình nhỉ? Mình đọc cái đoạn bạn viết ở trên mà không hiểu bạn muốn nói gì hết.]]>
/hvaonline/posts/list/28909.html#181405 /hvaonline/posts/list/28909.html#181405 GMT
Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#181407 /hvaonline/posts/list/28909.html#181407 GMT Re: Các cách xác thực người dùng bằng mật khẩu MrNothing đã giải thích rõ hơn rồi. @mrro: câu hỏi của mình là "tại sao các protocol này không được dùng phổ biến?", bạn ạ. Lí do là vì: 1. Đây là protocol đời đầu của dòng encrypted key exchange (EKE), nên hiển nhiên nó còn có nhiều khuyết điểm, không thể áp dụng ngay được. Ví dụ như bị DoS như ở trên. 2. Kể cả đến các protocol đời sau đã được chau chuốt nhiều, vẫn không được dùng phổ biến. Lí do khá đơn giản và lãng xẹt: chúng bị patented, hơn nữa là bị patented bởi nhiều researchers. Thế nên việc đưa vào một product đã rất phức tạp, chưa nói đến việc phổ biến. Ngoài ra, mrro còn thắc mắc về cái khoản plaintext password database ở trên server thì vulnerable. Thực ra, sửa lại protocol này một chút cũng không có gì khó, mặc dù không hoàn toàn là tuyệt đối secure. Mình sử dụng luôn notations của MrNothing, trong đó Bob chứa func(pw, salt), còn Alice chứa pw: Code:
1. Bob ---> Alice: salt
    Alice tính h=func(pw,salt)
2. Alice ---> Bob: E(h,PU)
3. Bob ---> Alice: E(PU, sk||nonce)
4. Alice ---> Bob: E(sk, nonce || pw)
]]>
/hvaonline/posts/list/28909.html#181414 /hvaonline/posts/list/28909.html#181414 GMT
Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#181420 /hvaonline/posts/list/28909.html#181420 GMT Re: Các cách xác thực người dùng bằng mật khẩu mrro nói làm sao để cài đặt giao thức không dùng plaintext-equivalent password. Ít ra hiện giờ có một giao thức thỏa mãn 7 điều kiện trên, được viết thành RFC 2945. Các bạn thử tìm hiểu và phân tích xem :). ]]> /hvaonline/posts/list/28909.html#181431 /hvaonline/posts/list/28909.html#181431 GMT Re: Các cách xác thực người dùng bằng mật khẩu

RFC 2945 wrote:
The server stores user credentials as 5-tuples of the form: {<username>, <password verifier>, <salt>, g, N} <salt> = random() x = SHA(<salt> | SHA( <username> | ":" | <raw password> ) ) <password verifier> = v = g^x % N N = prime modulus; g = generator
 
#Trong giao thức chuẩn thì họ dùng thừa số 1 thay cho thừa số 3 ở trên. Tấn công server lấy file chứa bộ {<username>, <password verifier>, <salt>, g, N} rồi giả mạo client thì sao nhỉ? hoặc đổi file này nữa?]]>
/hvaonline/posts/list/28909.html#181432 /hvaonline/posts/list/28909.html#181432 GMT
Re: Các cách xác thực người dùng bằng mật khẩu

MrNothing wrote:
Tấn công server lấy file chứa bộ {<username>, <password verifier>, <salt>, g, N} rồi giả mạo client thì sao nhỉ? hoặc đổi file này nữa?  
Chẳng làm được gì cả. Có password verifier cũng không thể tìm ra password. Cái khó ở đây là bài toán discrete logarithm. ]]>
/hvaonline/posts/list/28909.html#181440 /hvaonline/posts/list/28909.html#181440 GMT
Re: Các cách xác thực người dùng bằng mật khẩu mfeng. Còn 4 điều kiện ban đầu thì thực sự không quá khó để đạt được. Còn về forward secrecy thì protocol này fail.]]> /hvaonline/posts/list/28909.html#181441 /hvaonline/posts/list/28909.html#181441 GMT Re: Các cách xác thực người dùng bằng mật khẩu

StarGhost wrote:
trong đó Bob chứa func(pw, salt), còn Alice chứa pw: 1. Bob ---> Alice: salt Alice tính h=func(pw,salt) 2. Alice ---> Bob: E(h,PU) 3. Bob ---> Alice: E(PU, sk||nonce) 4. Alice ---> Bob: E(sk, nonce || pw)  
Giả sử attacker lấy được func(pw, salt). Nghĩa là hắn lấy được h ở bước số 2 đúng không? Vậy thì hắn có thể giả mạo Alice rồi còn gì nữa nhỉ? Mình sai ở chỗ nào nhờ bạn StarGhost chỉ giùm. PS: àh thấy rồi. có bước số 4.]]>
/hvaonline/posts/list/28909.html#181443 /hvaonline/posts/list/28909.html#181443 GMT
Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#181446 /hvaonline/posts/list/28909.html#181446 GMT Re: Các cách xác thực người dùng bằng mật khẩu 4. Alice ---> Bob: E(sk, nonce || pw)   Attacker mà có func(pw, salt), thì hắn chỉ cần lắng nghe một cái session giữa Alice và Bob là hắn tìm được pw, khỏi phải brute-force chi nữa. Ngoài ra thêm cái số 4 này, có thể ngăn attacker giả mạo Alice, nhưng không thể ngăn attacker giả mạo Bob, một khi hắn đã có (salt, func(pw, salt)). ]]> /hvaonline/posts/list/28909.html#181448 /hvaonline/posts/list/28909.html#181448 GMT Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#181451 /hvaonline/posts/list/28909.html#181451 GMT Re: Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#181715 /hvaonline/posts/list/28909.html#181715 GMT Re: Các cách xác thực người dùng bằng mật khẩu

myquartz wrote:
Cân bằng giữa giá trị và lợi ích mang lại sẽ là giải pháp được thực tế chấp nhận. Nếu cần bảo mật hơn nữa, đừng tìm kiếm giải pháp xác thực nào khác với password mà cần nâng lên PKI, công nghệ sẵn có, giá thành sẽ rẻ hơn nhiều đưa ra 1 loạt các scheme mới, chưa chắc đã chứng minh được tốt hơn, mà giá thành lại cao. Tất nhiên tranh cãi lý thuyết thì vẽ con voi nó có mấy vòi cũng được, nhưng ... tốn thời gian. 
Topic này lập ra đâu phải để làm một project gì đâu mà sợ tốn thời gian hả bạn. Nếu nói như bạn thì phải chăng các nghiên cứu về vấn đề này là dư thừa sao.]]>
/hvaonline/posts/list/28909.html#181743 /hvaonline/posts/list/28909.html#181743 GMT
Re: Các cách xác thực người dùng bằng mật khẩu

StarGhost wrote:
@myquartz: Hình như bạn còn chưa đọc kĩ và hiểu rõ về mục đích của topic, tức là thảo luận về authentication schemes, chứ không phải là về implementation. RFC 2617 chính là nói về protocol 1 và 2 ngay trong post đầu tiên, cùng với những vấn đề của chúng. Còn nếu nói về implementation, mình thật nghĩ không ra cái javascript của bạn chống được MitM attack kiểu gì.  
Nếu chỉ thảo luận lý thuyết, không dùng (hoặc không thể) triển khai thì bên dưới mình đã nói là nó sẽ phí thời gian. Sẽ giống như phát minh lại cái bánh xe, vì người ta đã có cái scheme đủ tốt để thực hiện rồi, chính nó là PKI. RFC 2617 không phải là protocol 2, nó mạnh hơn nhiều, vì không phải chỉ là salt, nó còn thêm nonce, nonceCount, clientNonce... Nó có khả năng chống MitM nếu sử dụng full option, nghĩa là HA2 gồm cả digest của method, URI và nội dung cần gửi đi. Kiểu Digest này chỉ yếu khi nó bị trình duyệt/MitM fail-back về RFC2096 (giống protocol 2). Tất nhiên RFC 2617 client không xác thực server, không phải là 2-way (mutual) authentication, đó không phải là mục tiêu của nó. Mình chỉ thấy rằng nó có thể triển khai thực tế để bảo vệ các web site NON-SSL thôi.]]>
/hvaonline/posts/list/28909.html#181765 /hvaonline/posts/list/28909.html#181765 GMT
Re: Các cách xác thực người dùng bằng mật khẩu

myquartz wrote:
Nếu chỉ thảo luận lý thuyết, không dùng (hoặc không thể) triển khai thì bên dưới mình đã nói là nó sẽ phí thời gian. Sẽ giống như phát minh lại cái bánh xe, vì người ta đã có cái scheme đủ tốt để thực hiện rồi, chính nó là PKI.  
Bạn myquartz ơi, ở đây người ta đang nói đến việc làm sao có một cơ chế xác thực tốt mà chỉ dựa vào mật khẩu của người dùng thôi. Đây là một hướng nghiên cứu với nhiều công trình của cryptography, chứ không phải là vấn đề đã được giải quyết rốt ráo rồi đâu bạn ơi. Tự dưng bạn lôi PKI ra, thế bạn thử nói xem một công ty bình thường, muốn xác thực khách hàng qua Internet, thì triển khai PKI thế nào? Mình chẳng biết công ty nào mà lại đi làm cái việc đó cả. Hình như cái này mình đã có nói một lần ở trên đây, bữa nay nói lại, gọi là mrro's law nha: hễ mà nói về bảo mật hay xác thực, thì không sớm thì muộn sẽ có người kêu phải triển khai PKI thôi.]]>
/hvaonline/posts/list/28909.html#181787 /hvaonline/posts/list/28909.html#181787 GMT
Re: Các cách xác thực người dùng bằng mật khẩu

mrro wrote:
Bạn myquartz ơi, ở đây người ta đang nói đến việc làm sao có một cơ chế xác thực tốt mà chỉ dựa vào mật khẩu của người dùng thôi. Đây là một hướng nghiên cứu với nhiều công trình của cryptography, chứ không phải là vấn đề đã được giải quyết rốt ráo rồi đâu bạn ơi. Tự dưng bạn lôi PKI ra, thế bạn thử nói xem một công ty bình thường, muốn xác thực khách hàng qua Internet, thì triển khai PKI thế nào? Mình chẳng biết công ty nào mà lại đi làm cái việc đó cả. Hình như cái này mình đã có nói một lần ở trên đây, bữa nay nói lại, gọi là mrro's law nha: hễ mà nói về bảo mật hay xác thực, thì không sớm thì muộn sẽ có người kêu phải triển khai PKI thôi. 
OK, hiểu ý rồi, khỏi tranh cãi. Lý do: đó là 1 hướng nghiên cứu mới về xác thực bằng mật khẩu (một cách đơn giản mà lại bảo đảm an toàn). Dự định áp dụng: cho dịch vụ web NON-SSL. Nếu thế nên thảo luận thêm 1 số cái scheme nữa, ví dụ CHAP, MS-CHAP, MD5-Challenge, EAP, NTLM... Theo quan điểm của tớ, giới nghiên cứu không tiếp tục đổ công sức thêm vào authentication scheme vì hiện đã có quá nhiều rồi. Nếu không sử dụng các công nghệ mã hoá và bảo đảm tính toàn vẹn, thì nghĩ ra 1 auth scheme thoả mãn 1-7 gần như là rất khó đạt được, hoặc scheme đó phải làm lại các thứ mà công nghệ SSL chẳng hạn đã có sẵn. Ví dụ việc sử dụng hàm E()/D() rất nhiều, chính nó là mã hoá đấy :-D. Ai tiếp tục theo thì ... xin mời tiếp. Tớ tưởng giúp ích được cho các bạn web master shared host ko có SSL, chứ thế này thì xin ngưng sau cái bài này thôi. @mrro: À mà PKI ở đây ko chỉ dùng là xác thực 2-way, rất tốn kém và phức tạp. Nó có thể là phương pháp xác thực 1-way là SSL (đã có 1 loạt chức năng an ninh rồi) với server-certificate only, ko cần client-cert. Với way còn lại là bằng cách chọn 1 trong các công nghệ công nghệ xác thực password hiện có ví dụ digest hay đơn giản là basic/form, người ta đã có 1 giải pháp khá hoàn chỉnh để chống được từ 1-7 rồi (tất nhiên còn 1 số nguy cơ khác nhưng nó là ở tại host). Cách kết hợp này không phải là mới, ví dụ Wifi (rất kém bảo mật, y như tình huống thảo luận trên đây) với EAP-TLS, client xác thực bằng user/pass, server xác thực bằng server-certificate, mã hóa và bảo đảm toàn vẹn bằng TLS, là giải pháp kết hợp 2 thứ, nhưng nhìn từ client vẫn là ... password. ]]>
/hvaonline/posts/list/28909.html#181830 /hvaonline/posts/list/28909.html#181830 GMT
Re: Các cách xác thực người dùng bằng mật khẩu

myquartz wrote:
Theo quan điểm của tớ, giới nghiên cứu không tiếp tục đổ công sức thêm vào authentication scheme vì hiện đã có quá nhiều rồi.  
Bạn myquartz dựa vào đâu mà nói hay vậy?

myquartz wrote:
RFC 2617 không phải là protocol 2, nó mạnh hơn nhiều, vì không phải chỉ là salt, nó còn thêm nonce, nonceCount, clientNonce... Nó có khả năng chống MitM nếu sử dụng full option, nghĩa là HA2 gồm cả digest của method, URI và nội dung cần gửi đi. Kiểu Digest này chỉ yếu khi nó bị trình duyệt/MitM fail-back về RFC2096 (giống protocol 2). Tất nhiên RFC 2617 client không xác thực server, không phải là 2-way (mutual) authentication, đó không phải là mục tiêu của nó. Mình chỉ thấy rằng nó có thể triển khai thực tế để bảo vệ các web site NON-SSL thôi. 
RFC 2617 đề cập đến 2 scheme, một cái là basic, cái kia là digest. Cái basic thì là protocol 1, cái digest ý tưởng chính là protocol 2, chỉ có điều nó thêm nonce để chống replay attacks. Còn lại mình không thấy có gì nổi trội ở đây mà có thể coi như là thay thế (thậm chí là miễn cưỡng) SSL cả. Còn bạn nói nó có khả năng chống MitM thì mình cho rằng không chính xác, vì message authentication chỉ là one-way. Ngược lại, RFC 2617 làm việc được dựa trên giả định rằng xác suất malicious MitM xuất hiện là vô cùng thấp, chứ nếu mà có nhiều MitM thì thôi rồi. Giả định này trên thực tế đúng phần nào với WWW, nhưng nếu như vậy, thì ngay đến Basic authentication cũng đã đủ rồi, chứ còn dùng digest authentication làm gì.]]>
/hvaonline/posts/list/28909.html#181859 /hvaonline/posts/list/28909.html#181859 GMT
Re: Các cách xác thực người dùng bằng mật khẩu

myquartz wrote:
Theo quan điểm của tớ, giới nghiên cứu không tiếp tục đổ công sức thêm vào authentication scheme vì hiện đã có quá nhiều rồi.  
Để mình trích một đoạn từ một bài báo mới đây của Cambridge Computer Security Lab nha (có bác Ross Anderson tác giả của Security Engineering với nhiều bác khác, có thể coi là một trong những lab hùng mạnh nhất thế giới về computer security và cryptography):

Feng Hao wrote:
Password Authenticated Key Exchange (PAKE) is one of the central topics in cryptography. It aims to address a practical security problem: how to establish secure communication between two parties solely based on their shared password without requiring a Public Key Infrastructure (PKI). The solution to the above problem is very useful in practice — in fact, so useful that it spawns a lot “fights” over patents. Many techniques were patented, including the well-known Encrypted Key Exchange (EKE) and Simple Password Exponential Key Exchange (SPEKE). A secondary problem is technical; both the EKE and SPEKE protocols have subtle but worrying technical limitations (see the paper for details). At the 16th Workshop on Security Protocols held in April 2008, Cambridge, UK, I presented a new solution (joint work with Peter Ryan) called Password Authenticated Key Exchange by Juggling (or J-PAKE). The essence of the protocol design inherits from the earlier work on solving the Dining Cryptographers problem; we adapted the same juggling technique to the two-party case to solve the PAKE problem. To our best knowledge, this design is significantly different from all past PAKE solutions.  
Xem thêm: http://www.lightbluetouchpaper.org/2008/05/29/j-pake/ ]]>
/hvaonline/posts/list/28909.html#181863 /hvaonline/posts/list/28909.html#181863 GMT
Re: Các cách xác thực người dùng bằng mật khẩu

MrNothing wrote:
Giao thức của bạn StarGhost vẫn chưa đủ rồi. Nếu salt chỉ loanh quanh luẩn quẩn ở các hàm cơ bản thì khó. Phải đưa lên dạng hàm một chiều one way function cơ, như x và g^x. Cái 4 còn vi phạm lỗi lớn là gửi đi password. 
Bạn nói chí phải. Nếu chỉ dùng hash thì quả là có limitation. Protocol của mình có thể modify lại và dùng non-interactive ZKP thay vì hash, như vậy chắc sẽ secure, vì dù attacker có giả dạng Bob cũng không thể lấy được password, ngoại trừ việc bruteforce password dựa vào database mà attacker ăn cắp được của Bob (if any).

mrro wrote:
@StarGhost: mình nghĩ bước số 4 này lại làm phát sinh một vấn đề

StarGhost wrote:
4. Alice ---> Bob: E(sk, nonce || pw) 
Attacker mà có func(pw, salt), thì hắn chỉ cần lắng nghe một cái session giữa Alice và Bob là hắn tìm được pw, khỏi phải brute-force chi nữa. Ngoài ra thêm cái số 4 này, có thể ngăn attacker giả mạo Alice, nhưng không thể ngăn attacker giả mạo Bob, một khi hắn đã có (salt, func(pw, salt)).  
--->Nếu attacker có func(pw,salt) thì vẫn không thể dò ra được pw bằng việc sniff. ---> Mình không nghĩ rằng tồn tại một protocol nào có thể ngăn chặn attacker giả mạo Bob một khi hắn đã nắm trong tay tất cả các secrets của Bob, trong trường hợp này là func(pw,salt).]]>
/hvaonline/posts/list/28909.html#181885 /hvaonline/posts/list/28909.html#181885 GMT
Re: Các cách xác thực người dùng bằng mật khẩu

StarGhost wrote:
1. Nếu attacker có func(pw,salt) thì vẫn không thể dò ra được pw bằng việc sniff. 2. Mình không nghĩ rằng tồn tại một protocol nào có thể ngăn chặn attacker giả mạo Bob một khi hắn đã nắm trong tay tất cả các secrets của Bob, trong trường hợp này là func(pw,salt).  
1. lol cái notation nó lừa mình như lần trước. 2. bạn StarGhost lại đúng. nhưng ý của mình ở đây là việc giả mạo Bob này đem lại một hậu quả ghê ghớm hơn là ở bước cuối cùng attacker sẽ có password ;-). lol câu cuối là mình xạo đó. mình không có nghĩ đến cái tình huống đó cho đến khi đọc cái last reply của bạn StarGhost. cần phải "mind your thought" như bạn StarGhost đề nghị :-p.]]>
/hvaonline/posts/list/28909.html#181901 /hvaonline/posts/list/28909.html#181901 GMT
Các cách xác thực người dùng bằng mật khẩu /hvaonline/posts/list/28909.html#185089 /hvaonline/posts/list/28909.html#185089 GMT