Google Safe Browsing v5 คาดหวังว่าไคลเอ็นต์จะดูแลรักษาฐานข้อมูลในเครื่อง ยกเว้นกรณีที่ไคลเอ็นต์เลือกโหมดเรียลไทม์แบบไม่มีพื้นที่เก็บข้อมูล รูปแบบและพื้นที่เก็บข้อมูลของฐานข้อมูลในเครื่องนี้ขึ้นอยู่กับลูกค้า เนื้อหาของฐานข้อมูลในเครื่องนี้อาจเปรียบเสมือนโฟลเดอร์ที่มีรายการต่างๆ เป็นไฟล์ และเนื้อหาของไฟล์เหล่านี้คือแฮช SHA256 หรือคำนำหน้าที่เกี่ยวข้องซึ่งมีคำนำหน้าแฮช 4 ไบต์ซึ่งเป็นความยาวแฮชที่ใช้กันมากที่สุด
รายการที่ใช้ได้
รายการจะระบุด้วยชื่อที่ไม่ซ้ำกันซึ่งเป็นไปตามรูปแบบการตั้งชื่อที่มีนามสกุลที่บ่งบอกความยาวของแฮชที่คุณควรเห็นในรายการ รายการแฮชที่มีประเภทภัยคุกคามเดียวกันแต่มีความยาวแฮชต่างกันจะเป็นรายการที่มีชื่อแยกต่างหากซึ่งจะมีนามสกุลที่ระบุความยาวแฮช
รายการต่อไปนี้พร้อมให้ใช้งานกับวิธีการรายการแฮช
ชื่อรายการ | ThreatType Enum ของ v4 ที่สอดคล้องกัน |
คำอธิบาย |
---|---|---|
gc-32b |
ไม่มี | รายการนี้เป็นรายการแคชส่วนกลาง ซึ่งเป็นรายการพิเศษที่ใช้ในโหมดการดำเนินการแบบเรียลไทม์เท่านั้น |
se-4b |
SOCIAL_ENGINEERING |
รายการนี้มีภัยคุกคามประเภท SOCIAL_ENGINEERING |
mw-4b |
MALWARE |
รายการนี้มีภัยคุกคามประเภทมัลแวร์สำหรับแพลตฟอร์มเดสก์ท็อป |
uws-4b |
UNWANTED_SOFTWARE |
รายการนี้มีภัยคุกคามประเภท UNWANTED_SOFTWARE สำหรับแพลตฟอร์มเดสก์ท็อป |
uwsa-4b |
UNWANTED_SOFTWARE |
รายการนี้มีภัยคุกคามประเภท UNWANTED_SOFTWARE สำหรับแพลตฟอร์ม Android |
pha-4b |
POTENTIALLY_HARMFUL_APPLICATION |
รายการนี้มีภัยคุกคามประเภท POTENTIALLY_HARMFUL_APPLICATION สำหรับแพลตฟอร์ม Android |
รายการเพิ่มเติมอาจพร้อมใช้งานในภายหลัง เมื่อถึงเวลานั้น ตารางด้านบนจะขยายออก และผลลัพธ์จากเมธอด hashList.list จะแสดงผลลัพธ์ที่คล้ายกับรายการล่าสุด
การอัปเดตฐานข้อมูล
โดยไคลเอ็นต์จะเรียกเมธอด hashList.get หรือเมธอด hashLists.batchGet เป็นประจำเพื่ออัปเดตฐานข้อมูล เนื่องจากไคลเอ็นต์ทั่วไปต้องการอัปเดตหลายรายการพร้อมกัน เราจึงขอแนะนำให้ใช้เมธอด hashLists.batchGet
ระบบจะไม่เปลี่ยนชื่อรายการ นอกจากนี้ เมื่อรายการปรากฏขึ้นแล้ว ระบบจะไม่นำรายการนั้นออก (หากรายการไม่มีประโยชน์แล้ว รายการจะว่างเปล่าแต่จะยังคงอยู่ต่อไป) ดังนั้น การเขียนโค้ดชื่อเหล่านี้แบบฮาร์ดโค้ดในโค้ดไคลเอ็นต์ Google Safe Browsing จึงเหมาะสม
ทั้งเมธอด hashList.get และเมธอด hashLists.batchGet รองรับการอัปเดตแบบเพิ่ม การใช้การอัปเดตแบบเพิ่มจะประหยัดแบนด์วิดท์และปรับปรุงประสิทธิภาพ การอัปเดตแบบเพิ่มจะทำงานโดยการส่งค่า Delta ระหว่างรายการเวอร์ชันของลูกค้ากับรายการเวอร์ชันล่าสุด (หากติดตั้งใช้งานไคลเอ็นต์ใหม่และไม่มีเวอร์ชันใดๆ ให้เลือก ให้อัปเดตแบบสมบูรณ์) การอัปเดตแบบเพิ่มมีดัชนีการนำออกและการเพิ่ม ลูกค้าจะต้องนำรายการในดัชนีที่ระบุออกจากฐานข้อมูลในเครื่องก่อน แล้วจึงใช้รายการที่เพิ่ม
สุดท้าย ไคลเอ็นต์ควรตรวจสอบข้อมูลที่จัดเก็บเทียบกับการตรวจสอบผลรวมที่เซิร์ฟเวอร์ระบุไว้เพื่อป้องกันความเสียหาย เมื่อใดก็ตามที่การตรวจสอบผลรวมไม่ตรงกัน ลูกค้าควรทำการอัปเดตอย่างเต็มรูปแบบ
การถอดรหัสเนื้อหารายการ
การถอดรหัสแฮชและคํานําหน้าแฮช
ระบบจะส่งรายการทั้งหมดโดยใช้การเข้ารหัสพิเศษเพื่อลดขนาด การเข้ารหัสนี้ทํางานโดยพิจารณาว่ารายการ Google Safe Browsing มีชุดแฮชหรือคำนำหน้าแฮช ซึ่งแยกแยะไม่ได้จากจำนวนเต็มแบบสุ่มทางสถิติ หากเราจัดเรียงจำนวนเต็มเหล่านี้และนำผลต่างที่อยู่ติดกัน ผลต่างที่อยู่ติดกันดังกล่าวควรจะ "เล็ก" ในบางแง่ จากนั้น การเข้ารหัส Golomb-Rice จะใช้ความเล็กนี้
สมมติว่าต้องส่งนิพจน์คำนำหน้าเส้นทางที่มีนามสกุลของโฮสต์ 3 รายการ ได้แก่ a.example.com/
, b.example.com/
และ y.example.com/
โดยใช้คำนำหน้าแฮช 4 ไบต์ ต่อไปสมมติว่าพารามิเตอร์ Rice ซึ่งแสดงด้วย k มีค่าเป็น
- เซิร์ฟเวอร์จะเริ่มด้วยการคำนวณแฮชแบบเต็มสำหรับสตริงเหล่านี้ ซึ่งได้แก่
291bc5421f1cd54d99afcc55d166e2b9fe42447025895bf09dd41b2110a687dc a.example.com/
1d32c5084a360e58f1b87109637a6810acad97a861a7769e8f1841410d2a960c b.example.com/
f7a502e56e8b01c6dc242b35122683c9d25d07fb1f532d9853eb0ef3ff334f03 y.example.com/
จากนั้นเซิร์ฟเวอร์จะสร้างคำนำหน้าแฮช 4 ไบต์สําหรับรายการข้างต้นแต่ละรายการ ซึ่งเป็น 4 ไบต์แรกของแฮชแบบเต็ม 32 ไบต์ ซึ่งตีความเป็นจำนวนเต็ม 32 บิตแบบ Big Endian รูปแบบ Big Endian หมายถึงการที่ไบต์แรกของแฮชแบบเต็มกลายเป็นไบต์ที่มีนัยสำคัญมากที่สุดของจำนวนเต็ม 32 บิต ขั้นตอนนี้จะทำให้เกิดจำนวนเต็ม 0x291bc542, 0x1d32c508 และ 0xf7a502e5
เซิร์ฟเวอร์จำเป็นต้องจัดเรียงคำนำหน้าแฮช 3 รายการนี้ตามลําดับตัวอักษร (เทียบเท่ากับการจัดเรียงตัวเลขใน Big Endian) และผลลัพธ์ของการจัดเรียงคือ 0x1d32c508, 0x291bc542, 0xf7a502e5 ระบบจะจัดเก็บคำนำหน้าแฮชแรกไว้โดยไม่มีการเปลี่ยนแปลงในช่อง first_value
จากนั้นเซิร์ฟเวอร์จะคํานวณผลต่าง 2 รายการที่อยู่ติดกัน ซึ่งได้แก่ 0xbe9003a และ 0xce893da3 ตามลําดับ ในกรณีที่เลือก k เป็น 30 เซิร์ฟเวอร์จะแยกตัวเลข 2 ตัวนี้ออกเป็นส่วนผลหารและส่วนเศษที่มีความยาว 2 และ 30 บิตตามลำดับ สำหรับตัวเลขแรก ส่วนผลหารคือ 0 และส่วนที่เหลือคือ 0xbe9003a ส่วนตัวเลขที่ 2 ส่วนผลหารคือ 3 เนื่องจาก 2 บิตที่มีค่ามากที่สุดคือ 11 ในฐาน 2 และส่วนที่เหลือคือ 0xe893da3 สำหรับผลหาร q
หนึ่งๆ ระบบจะเข้ารหัสเป็น (1 << q) - 1
โดยใช้บิต 1 + q
บิตพอดี ส่วนเศษจะเข้ารหัสโดยตรงโดยใช้บิต k ส่วนผลหารของจำนวนแรกเข้ารหัสเป็น 0 และส่วนเศษที่เหลือเป็นฐาน 2 001011111010010000000000111010 ส่วนผลหารของจำนวนที่ 2 เข้ารหัสเป็น 0111 และส่วนเศษที่เหลือคือ 001110100010010011110110100011
เมื่อตัวเลขเหล่านี้อยู่ในรูปแบบสตริงไบต์ ระบบจะใช้รูปแบบ Little Endian ในทางแนวคิด คุณอาจจินตนาการได้ง่ายขึ้นว่าสตริงบิตยาวๆ สร้างขึ้นโดยเริ่มจากบิตที่มีนัยสำคัญน้อยที่สุด โดยเราจะนำส่วนเศษของตัวเลขแรกไปไว้ข้างหน้าส่วนเศษของตัวเลขแรก จากนั้นนำส่วนเศษของตัวเลขที่ 2 ไปไว้ข้างหน้าส่วนเศษของตัวเลขแรก ซึ่งควรให้ผลลัพธ์เป็นตัวเลขขนาดใหญ่ต่อไปนี้ (มีการเพิ่มการแบ่งบรรทัดและคําอธิบายเพื่อให้ชัดเจน)
001110100010010011110110100011 # Second number, remainder part
0111 # Second number, quotient part
001011111010010000000000111010 # First number, remainder part
0 # First number, quotient part
เมื่อเขียนเป็นบรรทัดเดียวจะมีลักษณะดังนี้
00111010001001001111011010001101110010111110100100000000001110100
ตัวเลขนี้มากกว่า 8 บิตที่มีให้ในไบต์เดียวอย่างเห็นได้ชัด จากนั้นการเข้ารหัส Little Endian จะนำบิตที่มีนัยสำคัญน้อยที่สุด 8 บิตของตัวเลขนั้น และแสดงผลเป็นไบต์แรกซึ่งเป็น 01110100 เพื่อความชัดเจน เราจะจัดกลุ่มสตริงบิตข้างต้นเป็นกลุ่มละ 8 บิตโดยเริ่มจากบิตที่มีนัยสำคัญน้อยที่สุด
0 01110100 01001001 11101101 00011011 10010111 11010010 00000000 01110100
จากนั้นการเข้ารหัส Little Endian จะนําไบต์แต่ละรายการจากด้านขวาไปใส่ไว้ในสตริงไบต์
01110100
00000000
11010010
10010111
00011011
11101101
01001001
01110100
00000000
จะเห็นได้ว่าเนื่องจากแนวคิดของเราคือใส่ส่วนหน้าให้กับตัวเลขขนาดใหญ่ทางด้านซ้าย (กล่าวคือ เพิ่มบิตที่มีนัยสำคัญมากขึ้น) แต่เราเข้ารหัสจากด้านขวา (กล่าวคือ บิตที่มีนัยสำคัญน้อยที่สุด) การเข้ารหัสและการถอดรหัสจึงทําได้ทีละส่วน
ซึ่งสุดท้ายแล้วจะทำให้
additions_four_bytes {
first_value: 489866504
rice_parameter: 30
entries_count: 2
encoded_data: "t\000\322\227\033\355It\000"
}
ลูกค้าเพียงทำตามขั้นตอนข้างต้นย้อนกลับเพื่อถอดรหัสคำนำหน้าแฮช
การถอดรหัสดัชนีการนำออก
ดัชนีการนําออกได้รับการเข้ารหัสโดยใช้เทคนิคเดียวกันกับด้านบนโดยใช้จำนวนเต็ม 32 บิต
ความถี่ในการอัปเดต
ไคลเอ็นต์ควรตรวจสอบค่าที่เซิร์ฟเวอร์แสดงผลในฟิลด์ minimum_wait_duration
และใช้ค่าดังกล่าวเพื่อกำหนดเวลาการอัปเดตฐานข้อมูลครั้งถัดไป ค่านี้อาจเป็น 0 (ช่อง minimum_wait_duration
หายไปโดยสมบูรณ์) ซึ่งในกรณีนี้ ลูกค้าควรทำการอัปเดตอีกครั้งทันที