Randomart và thuật toán The Drunken Bishop

5380

Bài viết được sự cho phép của tác giả Huỳnh Quán Cẩm

Khi tạo OpenSSH key ta hay bắt gặp một cái hình tên là randomart.

  Thuật toán là gì? 11 thuật toán hàng đầu dành cho lập trình viên
  20 thuật ngữ chuyên sâu trong Quản lý Nhân sự nội bộ
The key's randomart image is:
+---[RSA 2048]----+
|   .  o.+.       |
|  o .. +..       |
| o o. ... .      |
|. =  . =..       |
|.o.o  o.S .      |
| +. o  +.o o     |
|. oo..+o= o .    |
| +...o=*o= .     |
|o......EB        |
+----[SHA256]-----+

Có bao giờ bạn thắc mắc hình này dùng để làm gì không?

1. randomart là gì?

Khi tạo kết nối SSH tới một host nào đó, OpenSSH sẽ yêu cầu host đó cung cấp RSS key fingerprint.

$ ssh host.xyz
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.

Fingerprint này được dùng để xác thực host. Điều bạn cần làm với fingerprint này là kiểm tra xem nó có trùng với key của host đích mà bạn đang kết nối tới hay không. Trùng thì không có gì để bàn rồi. Còn không trùng thì … rất có khả năng bạn đang bị tấn công MiTM.

Randomart và thuật toán The Drunken Bishop

Nhưng những fingerprint này thường là những chuỗi vô nghĩa. Cách để so trùng những chuỗi này là … so trùng từng chữ bằng mắt. Chúa tạo ra con người hoàn hảo tuyệt đối. Trừ cặp mắt thôi. Điểm mù, saccades, đủ thứ cả. Chưa kể còn sai sót nữa. Bắt tui ngồi so những chuỗi dạng nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 cả ngày, thà bỏ nghề đi làm cách mạng còn hơn.

Vì vậy, randomart được sinh ra nhắm giải quyết bài toán này. Nó trực quan hóa những chuỗi vô nghĩa thành hình ảnh. Từ những hình ảnh này, người dùng có thể nhanh chóng phán đoán được độ đúng đắn của host key.

Đồng thời những hình ảnh này có thể sẽ rất khác nhau cho dù fingerprint của chúng chỉ lệch nhau một chút. Từ đó giúp giảm thiểu sai sót của user người truồng mắt trần.

Randomart của fingerprint ở trên có hình dạng như dưới. Để thấy hình randomart, bạn cần bật VisualHostKey=yes trong SSH config.

$ ssh host.xyz
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
+---[RSA 2048]----+
| =+o...+=o..     |
|o++... *o .      |
|*.o.  *o.        |
|oo.  ..o.= .     |
|.+o. .. S =      |
|*=+ .  o = .     |
|OE .  . o        |
| o     .         |
|                 |
+----[SHA256]-----+
Are you sure you want to continue connecting (yes/no)?

Nếu bạn chưa nhận ra, đây là host key của Github . Nếu một ngày pull code từ Github về mà không thấy hình ảnh quen thuộc này, tui sẽ lập tức đánh hơi được sự bất thường. Cách mạng đã tràn về như một cơn sóng rồi sao?

Randomart được tạo ra từ một thuật toán sặc mùi bia rượu: The Drunken Bitshop (tạm dịch: Say quắc ông giám mục).

2. Thuật toán

Thuật toán được tóm gọn trong một đoạn văn như sau:

2.1. Bắt đầu

Thuật toán khá đơn giản, Peter cũng bắt đầu từ chính giữa phòng, kí tự hiệu là ‘S’.

1111111
01234567890123456
+-----------------+x (column)
0|                 |
1|                 |
2|                 |
3|                 |
4|        S        |
5|                 |
6|                 |
7|                 |
8|                 |
+-----------------+
y
(row)

2.2. Di chuyển

Giám mục Peter có thể di chuyển theo 4 hướng: 

bits hướng
00
01
10
11

Bắt đầu với một fingerprint dạng MD5 với các octet a1:b2:c3:d4:e5:f6:...:e1. Ta tiến hành dịch nó từ HEX sang binary như sau:

10100001:10110010:11000011:...:11100001

Đọc theo Little Endian, nó sẽ thành:

01 00 10 10 : 10 00 11 10 : ... : 01 00 10 11

Áp dụng với bảng ở trên, các bước đầu tiên của giám mục Peter lần lượt là: 

1111111
01234567890123456
+-----------------+x (column)
0|                 |
1|                 |
2|        .        |
3|       . .       |
4|    . . S        |
5|     .           |
6|                 |
7|                 |
8|                 |
+-----------------+
y
(row)

Đụng tường

Như đã mô tả, khi đụng tường Peter sẽ đi ngang hay dọc tùy theo hướng.

Giả sử ông ta đang ở vị trí 0-4 (x-y), và hướng tiếp theo của chúng ta là 

1111111
  01234567890123456
+-----------------+x (column)
0|                 |
1|                 |
2|        .        |
3|.      . .       |
4|.   . . S        |
5| . . .           |
6|  .              |
7|                 |
8|                 |
+-----------------+
y
(row)

2.3. Đánh dấu

Để đánh dấu, ứng với số lần mà ô đó được đi qua, ta sẽ dùng các kí hiệu sau.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  . o + = * B O X @  %  &  #  /  ^  S  E

Nếu ô đó được đi qua 7 lần, ta sẽ đánh O, 11 lần sẽ đánh &, S là ô bắt đầu và E là ô kết thúc.

Và cứ như thế, một hình ảnh randomart đã được tạo ra.

3. Tham khảo

Các bạn có thể tham khảo về thuật toán tại paper The drunken bishop: An analysis of the OpenSSH fingerprint visualization algorithm.

4. Bài viết này sẽ giúp tui tăng lương như thế nào?

Như thường lệ bài viết không có giúp bạn tăng lương. Cơ mà có một số điều rút ra là:

  1. Luôn kiểm tra host key khi kết nối SSH, để lỡ có ăn hành thì cũng biết đường mà … đánh răng.
  2. Bật VisualHostKey=yes trong SSH config để kiểm tra bằng hình ảnh thay vì bằng chuỗi.

Bài viết gốc được đăng tải tại quan-cam.com

Có thể bạn quan tâm:

Xem thêm các việc làm Developer hấp dẫn tại TopDev