Google Safe Browsing phiên bản 5 yêu cầu ứng dụng duy trì cơ sở dữ liệu cục bộ, ngoại trừ khi ứng dụng chọn Chế độ thời gian thực không lưu trữ. Định dạng và bộ nhớ của cơ sở dữ liệu cục bộ này tuỳ thuộc vào ứng dụng. Về mặt khái niệm, nội dung của cơ sở dữ liệu cục bộ này có thể được coi là một thư mục chứa nhiều danh sách dưới dạng tệp và nội dung của các tệp này là hàm băm SHA256 hoặc tiền tố tương ứng của hàm băm với tiền tố băm 4 byte là độ dài băm được sử dụng phổ biến nhất.
Danh sách có sẵn
CẬP NHẬT: Bảng sau đây bao gồm các danh sách mới được giới thiệu, tuân theo quy ước đặt tên trong đó tên chứa hậu tố biểu thị độ dài của hàm băm mà bạn dự kiến sẽ có trong danh sách. Phương thức hashList
ban đầu hỗ trợ nhiều độ dài hàm băm, với tuỳ chọn để ứng dụng yêu cầu một độ dài hàm băm cụ thể bằng cách chỉ định tham số truy vấn desiredHashLength. Chúng tôi sẽ thay thế API này bằng một giao diện API rõ ràng hơn để hỗ trợ độ dài hàm băm đơn thay vì nhiều độ dài. Danh sách hàm băm có cùng loại mối đe doạ nhưng có độ dài hàm băm khác nhau sẽ là một danh sách được đặt tên riêng biệt, được xác định bằng hậu tố cho biết độ dài hàm băm. Với thay đổi này, chúng tôi sẽ ngừng sử dụng trường desiredHashLength trong cả phương thức hashList.get
và hashLists.batchGet
, vì chỉ có một độ dài hàm băm được hỗ trợ cho một danh sách nhất định. Bạn có thể cập nhật các trường hashList.hashListMetadata
để phản ánh thay đổi này.
Bạn nên sử dụng các danh sách sau trong phiên bản v5alpha1:
Tên danh sách | Enum ThreatType v4 tương ứng |
Mô tả |
---|---|---|
gc-32b |
Không nhận được thông báo nào | Danh sách này là danh sách Bộ nhớ đệm toàn cục. Đây là danh sách đặc biệt chỉ được dùng trong chế độ Hoạt động theo thời gian thực. |
se-4b |
SOCIAL_ENGINEERING |
Danh sách này chứa các mối đe doạ thuộc loại SOCIAL_ENGINEERING. |
mw-4b |
MALWARE |
Danh sách này chứa các mối đe doạ thuộc loại PHẦN MỀM ĐỘC HẠI cho nền tảng máy tính. |
uws-4b |
UNWANTED_SOFTWARE |
Danh sách này chứa các mối đe doạ thuộc loại mối đe doạ UNWANTED_SOFTWARE cho các nền tảng máy tính. |
uwsa-4b |
UNWANTED_SOFTWARE |
Danh sách này chứa các mối đe doạ thuộc loại mối đe doạ UNWANTED_SOFTWARE cho nền tảng Android. |
pha-4b |
POTENTIALLY_HARMFUL_APPLICATION |
Danh sách này chứa các mối đe doạ thuộc loại mối đe doạ POTENTIALLY_HARMFUL_APPLICATION cho nền tảng Android. |
Chúng tôi sẽ cung cấp thêm các danh sách khác sau này và bảng trên sẽ được mở rộng.
Bản cập nhật cơ sở dữ liệu
Ứng dụng sẽ thường xuyên gọi phương thức hashList.get hoặc phương thức hashLists.batchGet để cập nhật cơ sở dữ liệu. Vì ứng dụng khách thông thường sẽ muốn cập nhật nhiều danh sách cùng một lúc, nên bạn nên sử dụng phương thức hashLists.batchGet.
Danh sách được xác định bằng tên riêng biệt. Tên là các chuỗi ASCII ngắn, dài vài ký tự.
Sau khi API được phát hành công khai, tên danh sách sẽ không bao giờ được đổi tên. Hơn nữa, sau khi xuất hiện, danh sách sẽ không bao giờ bị xoá (nếu danh sách không còn hữu ích, danh sách đó sẽ trở thành danh sách trống nhưng vẫn tồn tại). Do đó, bạn nên mã hoá cứng các tên này trong mã ứng dụng của tính năng Duyệt web an toàn của Google.
Cả phương thức hashList.get và phương thức hashLists.batchGet đều hỗ trợ tính năng cập nhật tăng dần. Việc sử dụng bản cập nhật gia tăng giúp tiết kiệm băng thông và cải thiện hiệu suất. Tính năng cập nhật gia tăng hoạt động bằng cách phân phối delta giữa phiên bản danh sách của ứng dụng và phiên bản danh sách mới nhất. (Nếu một ứng dụng khách mới được triển khai và không có phiên bản nào, thì bạn có thể cập nhật toàn bộ.) Bản cập nhật gia tăng chứa các chỉ mục xoá và thêm. Trước tiên, ứng dụng sẽ xoá các mục nhập tại các chỉ mục được chỉ định khỏi cơ sở dữ liệu cục bộ, sau đó áp dụng các mục bổ sung.
Cuối cùng, để ngăn chặn tình trạng hỏng hóc, ứng dụng khách phải kiểm tra dữ liệu được lưu trữ theo tổng kiểm do máy chủ cung cấp. Bất cứ khi nào tổng kiểm không khớp, ứng dụng phải thực hiện cập nhật toàn bộ.
Giải mã nội dung danh sách
Giải mã hàm băm và tiền tố hàm băm
Tất cả danh sách đều được phân phối bằng cách sử dụng một phương thức mã hoá đặc biệt để giảm kích thước. Phương thức mã hoá này hoạt động bằng cách nhận ra rằng các danh sách của tính năng Duyệt web an toàn của Google chứa một tập hợp các hàm băm hoặc tiền tố hàm băm, về mặt lý thuyết, không thể phân biệt được về mặt thống kê với các số nguyên ngẫu nhiên. Nếu chúng ta sắp xếp các số nguyên này và lấy chênh lệch liền kề của chúng, thì chênh lệch liền kề đó dự kiến sẽ "nhỏ" theo một nghĩa nào đó. Sau đó, quy trình mã hoá Golomb-Rice sẽ khai thác độ nhỏ này.
Giả sử 3 biểu thức tiền tố đường dẫn hậu tố máy chủ, cụ thể là a.example.com/
, b.example.com/
và y.example.com/
, sẽ được truyền bằng tiền tố băm 4 byte. Giả sử thêm rằng tham số Rice, ký hiệu là k, được chọn là
- Máy chủ sẽ bắt đầu bằng cách tính toán hàm băm đầy đủ cho các chuỗi này, lần lượt là:
291bc5421f1cd54d99afcc55d166e2b9fe42447025895bf09dd41b2110a687dc a.example.com/
1d32c5084a360e58f1b87109637a6810acad97a861a7769e8f1841410d2a960c b.example.com/
f7a502e56e8b01c6dc242b35122683c9d25d07fb1f532d9853eb0ef3ff334f03 y.example.com/
Sau đó, máy chủ sẽ tạo tiền tố băm 4 byte cho từng giá trị ở trên, đây là 4 byte đầu tiên của băm đầy đủ 32 byte, được diễn giải dưới dạng số nguyên 32 bit big-endian. Thứ tự big endian đề cập đến việc byte đầu tiên của hàm băm đầy đủ trở thành byte có giá trị quan trọng nhất của số nguyên 32 bit. Bước này sẽ tạo ra các số nguyên 0x291bc542, 0x1d32c508 và 0xf7a502e5.
Máy chủ cần sắp xếp ba tiền tố băm này theo thứ tự bảng chữ cái (tương đương với việc sắp xếp số theo big endian) và kết quả của quá trình sắp xếp là 0x1d32c508, 0x291bc542, 0xf7a502e5. Tiền tố băm đầu tiên được lưu trữ không thay đổi trong trường first_value
.
Sau đó, máy chủ sẽ tính toán hai hiệu số liền kề, lần lượt là 0xbe9003a và 0xce893da3. Giả sử k được chọn là 30, máy chủ sẽ chia hai số này thành các phần thương và phần dư có độ dài lần lượt là 2 và 30 bit. Đối với số đầu tiên, phần thương là 0 và phần dư là 0xbe9003a; đối với số thứ hai, phần thương là 3 vì hai bit có giá trị quan trọng nhất là 11 ở dạng nhị phân và phần dư là 0xe893da3. Đối với một thương số q
nhất định, thương số này được mã hoá thành (1 << q) - 1
bằng cách sử dụng chính xác 1 + q
bit; phần dư được mã hoá trực tiếp bằng k bit. Phần thương của số đầu tiên được mã hoá là 0 và phần dư ở dạng nhị phân 001011111010010000000000111010; phần thương của số thứ hai được mã hoá là 0111 và phần dư là 001110100010010011110110100011.
Khi các số này được tạo thành một chuỗi byte, little endian sẽ được sử dụng. Về mặt khái niệm, bạn có thể dễ dàng hình dung một chuỗi bit dài được hình thành bắt đầu từ các bit có giá trị thấp nhất: chúng ta lấy phần thương của số đầu tiên và thêm vào phần dư của số đầu tiên; sau đó, chúng ta thêm phần thương của số thứ hai và thêm phần dư. Thao tác này sẽ tạo ra một số lớn sau đây (đã thêm dấu ngắt dòng và nhận xét để rõ ràng):
001110100010010011110110100011 # Second number, remainder part
0111 # Second number, quotient part
001011111010010000000000111010 # First number, remainder part
0 # First number, quotient part
Nếu viết trên một dòng, mã này sẽ là
00111010001001001111011010001101110010111110100100000000001110100
Rõ ràng là con số này vượt xa 8 bit có trong một byte. Sau đó, phương thức mã hoá little endian sẽ lấy 8 bit có giá trị nhỏ nhất trong số đó và xuất ra dưới dạng byte đầu tiên là 01110100. Để rõ ràng, chúng ta có thể nhóm chuỗi bit ở trên thành các nhóm gồm 8 bit, bắt đầu từ các bit có giá trị ít quan trọng nhất:
0 01110100 01001001 11101101 00011011 10010111 11010010 00000000 01110100
Sau đó, phương thức mã hoá little endian sẽ lấy từng byte từ bên phải và đặt byte đó vào một chuỗi byte:
01110100
00000000
11010010
10010111
00011011
11101101
01001001
01110100
00000000
Có thể thấy rằng vì về mặt khái niệm, chúng ta đưa vào đầu các phần mới vào số lớn ở bên trái (tức là thêm các bit có ý nghĩa hơn) nhưng chúng ta mã hoá từ bên phải (tức là các bit có ý nghĩa ít nhất), nên quá trình mã hoá và giải mã có thể được thực hiện tăng dần.
Cuối cùng, điều này dẫn đến
additions_four_bytes {
first_value: 489866504
rice_parameter: 30
entries_count: 2
encoded_data: "t\000\322\227\033\355It\000"
}
Ứng dụng chỉ cần làm theo các bước trên theo hướng ngược lại để giải mã tiền tố hàm băm.
Giải mã Chỉ mục xoá
Chỉ mục xoá được mã hoá bằng chính kỹ thuật như trên bằng số nguyên 32 bit.
Tần suất cập nhật
Ứng dụng phải kiểm tra giá trị được trả về của máy chủ trong trường minimum_wait_duration
và sử dụng giá trị đó để lên lịch cập nhật cơ sở dữ liệu tiếp theo. Giá trị này có thể bằng 0 (trường minimum_wait_duration
bị thiếu hoàn toàn). Trong trường hợp này, ứng dụng PHẢI thực hiện một lần cập nhật khác ngay lập tức.