Giao thức Needham-Schroeder

**Needham-Schroeder** là một giao thức truyền thông phục vụ cho việc xác thực trên các mạng máy tính không an toàn. Giao thức do Roger Needham và Michael Schroeder phát minh vào năm 1978. Nó cho phép các thực thể trao đổi thông tin có thể chứng minh nhận dạng của mình đồng thời chống lại việc nghe lén và phát hiện, ngăn chặn việc truy cập, thay đổi thông tin trên đường truyền thông tin.

## Giao thức Needham-Schroeder với khóa bí mật
Theo cách ký hiệu giao thức mật mã, giao thức Needham-Schroeder với khóa bí mật được mô tả như sau, trong đó, Alice (A) sử dụng máy chủ (S) chứng minh nhận dạng của mình với Bob (B), đồng thời tạo ra một khóa chung ({K_{AB}}):

# A \rightarrow S: A,B,N_A
# S \rightarrow A: \{N_A, K_{AB}, B, \{K_{AB}, A\}_{K_{BS}}\}_{K_{AS}}
# A \rightarrow B: \{K_{AB}, A\}_{K_{BS}}
# B \rightarrow A: \{N_B\}_{K_{AB}}
# A \rightarrow B: \{N_B-1\}_{K_{AB}}

(0) Trước khi các giao dịch có thể diễn ra, mỗi người sử dụng trong hệ thống có một khóa bí mật chia sẻ với máy chủ. Ở đây K_{XS} là khóa chung giữa X và máy chủ S.

(1) Khi muốn trao đổi thông tin với Bob, đầu tiên, Alice gửi một gói tin tới máy chủ trong đó có định danh của Alice và Bob cùng với một số được tạo ngẫu nhiên N_A.

(2) Máy chủ tạo ra một khóa phiên {K_{AB}} để Alice và Bob sử dụng trong giao dịch tiếp theo. Sau đó, máy chủ gửi khóa này cho Alice dưới dạng mật mã hóa bằng khóa chung giữa máy chủ và Alice; đồng thời máy chủ cũng mật mã hóa khóa phiên bằng khóa chung với Bob và gửi cho Alice. Số ngẫu nhiên N_A được gửi kèm cùng gói tin để đảm bảo gói tin là mới (tránh trường hợp kẻ tấn công dùng lại gói tin cũ) và định danh của Bob để Alice biết được người để dùng khóa (trong trường 
hợp Alice đồng thời giao dịch với nhiều người).

(3) Alice giải mã và gửi phần mã hóa bằng khóa của Bob tới cho Bob. Alice không thể giải mã được phần này và chỉ có Bob mới giải mã được.

(4) Bob giải mã gói tin nhận được và thu được khóa phiên. Bob tạo ra một số ngẫu nhiên khác và gửi cho Alice sau khi mật mã hóa với khóa phiên để chứng tỏ mình đã nhận được khóa.

(5) Alice giải mã, thực hiện một phép toán đơn giản trên giá trị nhận được rồi gửi lại cho Bob để khẳng định giao dịch tiếp tục và Alice là người thực sự có khóa.

### Tấn công
Giao thức này không đảm bảo an toàn. Vấn đề là ở gói tin số 3: Bob không thể xác định được đây có phải là gói tin mới được tạo ra hay là gói tin được phát lại. Nếu một người thứ 3 có được một khóa cũ thì có thể thực hiện tấn công bằng cách phát lại gói tin và làm cho Bob tin rằng mình đang trao đổi thông tin với Alice.
### Ngăn chặn
Dùng Tem thời gian (TimeStamp): Xem Giao thức Kerberos

## Giao thức Needham-Schroeder với khóa công khai
Giao thức này sử dụng khóa công khai.

Alice (A) và Bob (B) sử dụng server trung gian (S) lưu trữ khóa công khai của các máy. Gọi:
* KPA và KSA, tương ứng với khóa công khai và khóa riêng của A
* KPB và KSB, tương tự đối với B
* KPS và KSS, tương tự với server S. (Chú ý rằng KSS dùng để *mã hóa* và KPS để *giải mã*).

Các bước trao đổi:

A \rightarrow S: \left. A, B \right.
:A lấy khóa công khai của B từ S
S \rightarrow A: \{K_{PB}, B\}_{K_{SS}}
:S gửi cho A khóa công khai KPB của B và định danh của B, thông tin được mã hóa bởi khóa riêng của S
A \rightarrow B: \{N_A, A\}_{K_{PB}}
:A gửi số ngẫu nhiên NA và định danh của A cho B, thông tin được mã hóa bởi khóa công khai của B.
B \rightarrow S: \left. B, A \right.
:B yêu cầu khóa công khai của A.
S \rightarrow B: \{K_{PA}, A\}_{K_{SS}}
:Server gửi cho B.
B \rightarrow A: \{N_A, N_B\}_{K_{PA}}
:B gửi số ngẫu nhiên NB, NA để chứng tỏ đã nhận được từ A, thông tin được mã hóa bằng khóa công khai của A.
A \rightarrow B: \{N_B\}_{K_{PB}}
:A xác nhận và gửi NB tới B, thông tin được mã hóa bằng khóa công khai của B

### Tấn công

Cách tấn công với tên gọi man-in-the-middle (người đứng giữa).

A \rightarrow I: \{N_A, A\}_{K_{PI}}

I \rightarrow B: \{N_A, A\}_{K_{PB}}

B \rightarrow I: \{N_A, N_B\}_{K_{PA}}

I \rightarrow A: \{N_A, N_B\}_{K_{PA}}

A \rightarrow I: \{N_B\}_{K_{PI}}

I \rightarrow B: \{N_B\}_{K_{PB}}

### Ngăn chặn

Thay:

B \rightarrow A: \{N_A, N_B\}_{K_{PA}}

Bởi:

B \rightarrow A: \{N_A, N_B, B\}_{K_{PA}}

## Xem thêm
* Giao thức Kerberos
* Giao thức Otway-Rees
* Giao thức Wide Mouth Frog.

## Tham khảo