หน้านี้มีข้อมูลเกี่ยวกับฟีเจอร์การเข้ารหัสของ Android Keystore ตามที่การติดตั้งใช้งาน KeyMint (หรือ Keymaster) พื้นฐานระบุไว้
องค์ประกอบพื้นฐานของการเข้ารหัส
Keystore มีการดำเนินการในหมวดหมู่ต่อไปนี้
- การสร้างคีย์ซึ่งส่งผลให้เกิดเนื้อหาคีย์ส่วนตัวหรือคีย์ลับที่
เข้าถึงได้เฉพาะในสภาพแวดล้อมที่ปลอดภัย ไคลเอ็นต์สร้างคีย์ได้ด้วยวิธีต่อไปนี้
- การสร้างคีย์ใหม่
- การนำเข้าเนื้อหาคีย์ที่ไม่ได้เข้ารหัส
- การนำเข้าเนื้อหาคีย์ที่เข้ารหัส
- การรับรองคีย์: การสร้างคีย์แบบอสมมาตรจะสร้างใบรับรองที่เก็บส่วนคีย์สาธารณะของคู่คีย์ นอกจากนี้ ใบรับรองนี้ยังอาจมีข้อมูลเกี่ยวกับข้อมูลเมตาสำหรับคีย์และสถานะของอุปกรณ์ ซึ่งทั้งหมดลงนามโดยคีย์ที่เชื่อมโยงกลับไปยังรูทที่เชื่อถือได้
- การดำเนินการเข้ารหัส
- การเข้ารหัสและการถอดรหัสแบบสมมาตร (AES, 3DES)
- การถอดรหัสแบบอสมมาตร (RSA)
- การลงนามแบบอสมมาตร (ECDSA, RSA)
- การลงนามและการยืนยันแบบสมมาตร (HMAC)
- ข้อตกลงเกี่ยวกับคีย์แบบอสมมาตร (ECDH)
องค์ประกอบของโปรโตคอล เช่น วัตถุประสงค์ โหมด และการเพิ่มแพดดิง รวมถึงข้อจำกัดในการควบคุมการเข้าถึง จะได้รับการระบุเมื่อสร้างหรือนำเข้าคีย์ และจะเชื่อมโยงกับคีย์อย่างถาวร เพื่อให้มั่นใจว่าจะไม่สามารถใช้คีย์ในลักษณะอื่นได้
นอกเหนือจากรายการข้างต้นแล้ว การใช้งาน KeyMint (เดิมคือ Keymaster) ยังมีบริการอีกอย่างหนึ่งที่ไม่ได้แสดงเป็น API นั่นคือการสร้างตัวเลขสุ่ม ใช้ภายในเพื่อสร้างคีย์ เวกเตอร์การเริ่มต้น (IV) การเพิ่มแบบสุ่ม และองค์ประกอบอื่นๆ ของโปรโตคอลที่ปลอดภัยซึ่งต้องใช้การสุ่ม
Primitive ที่จำเป็น
การติดตั้งใช้งาน KeyMint ทั้งหมดมีฟีเจอร์ต่อไปนี้
- RSA
- รองรับคีย์ 2048, 3072 และ 4096 บิต
- รองรับเลขชี้กำลังสาธารณะ F4 (2^16+1)
- โหมดการเพิ่มระยะขอบสำหรับการลงนาม RSA
- RSASSA-PSS (
PaddingMode::RSA_PSS) - RSASSA-PKCS1-v1_5 (
PaddingMode::RSA_PKCS1_1_5_SIGN)
- RSASSA-PSS (
- โหมดสรุปสำหรับการลงนาม RSA
- SHA-256
- โหมดการเพิ่มแพดดิ้งสำหรับการเข้ารหัส/ถอดรหัส RSA
- แบบไม่บุ
- RSAES-OAEP (
PaddingMode::RSA_OAEP) - RSAES-PKCS1-v1_5 (
PaddingMode::RSA_PKCS1_1_5_ENCRYPT)
- ECDSA
- ระบบรองรับคีย์ 224, 256, 384 และ 521 บิต โดยใช้เส้นโค้ง NIST P-224, P-256, P-384 และ P-521 ตามลำดับ
- โหมดสรุปสำหรับ ECDSA
- ไม่มีสรุป (เลิกใช้งานแล้วและจะนำออกในอนาคต)
- SHA-256
- AES
- รองรับคีย์ 128 และ 256 บิต
- CBC, CTR, ECB และ GCM การติดตั้งใช้งาน GCM ไม่อนุญาตให้ใช้แท็กที่มีขนาดเล็กกว่า 96 บิตหรือความยาวของ Nonce ที่ไม่ใช่ 96 บิต
- รองรับโหมดการเพิ่มพื้นที่ว่าง
PaddingMode::NONEและPaddingMode::PKCS7สำหรับโหมด CBC และ ECB หากไม่มีการเพิ่มแพดดิ้ง การเข้ารหัสโหมด CBC หรือ ECB จะล้มเหลวหากอินพุตไม่ใช่จำนวนเท่าของขนาดบล็อก
- HMAC SHA-256 ที่มีขนาดคีย์ใดก็ได้ สูงสุดอย่างน้อย 32 ไบต์
ขอแนะนำเป็นอย่างยิ่งให้ใช้ SHA1 และสมาชิกอื่นๆ ในตระกูล SHA2 (SHA-224, SHA384 และ SHA512) สำหรับการติดตั้งใช้งาน KeyMint Keystore จะให้ข้อมูลดังกล่าว ในซอฟต์แวร์หากการติดตั้งใช้งาน KeyMint ของฮาร์ดแวร์ไม่ได้ให้ข้อมูลดังกล่าว
นอกจากนี้ เรายังแนะนำให้ใช้ Primitive บางรายการเพื่อการทำงานร่วมกันกับระบบอื่นๆ ด้วย
- ขนาดคีย์ RSA ที่เล็กลง
- เลขชี้กำลังสาธารณะแบบกำหนดเองสำหรับ RSA
การควบคุมการเข้าถึงคีย์
คีย์ที่อิงตามฮาร์ดแวร์ซึ่งไม่สามารถดึงออกจากอุปกรณ์ได้จะไม่ให้ความปลอดภัยมากนักหากผู้โจมตีใช้คีย์เหล่านั้นได้ตามต้องการ (แม้ว่าจะปลอดภัยกว่าคีย์ที่ดึงข้อมูลออกได้) ดังนั้น Keystore จึงต้องบังคับใช้การควบคุมการเข้าถึง
การควบคุมการเข้าถึงจะกำหนดเป็น "รายการการให้สิทธิ์" ของคู่แท็ก/ค่า แท็กการให้สิทธิ์เป็นจำนวนเต็ม 32 บิต และค่าเป็นประเภทต่างๆ คุณสามารถใช้แท็กบางรายการซ้ำเพื่อระบุค่าหลายค่าได้ ระบุว่าแท็กทำซ้ำได้หรือไม่ในอินเทอร์เฟซ HAL ของ KeyMint เมื่อสร้างคีย์ ผู้เรียกจะระบุรายการการให้สิทธิ์ การติดตั้งใช้งาน KeyMint ที่อยู่ภายใต้ Keystore จะแก้ไขรายการเพื่อระบุข้อมูลเพิ่มเติมบางอย่าง เช่น คีย์มีการป้องกันการย้อนกลับหรือไม่ และส่งคืนรายการการให้สิทธิ์ "สุดท้าย" ที่เข้ารหัสเป็น Blob ของคีย์ที่ส่งคืน ความพยายามใดๆ ในการใช้ คีย์สำหรับการดำเนินการเข้ารหัสลับจะล้มเหลวหากมีการแก้ไขรายการการให้สิทธิ์สุดท้าย
สำหรับ Keymaster 2 และเวอร์ชันก่อนหน้า ชุดแท็กที่เป็นไปได้
จะกำหนดไว้ในการแจงนับ
keymaster_authorization_tag_t และ
จะได้รับการแก้ไขอย่างถาวร (แม้ว่าจะขยายได้ก็ตาม)
ชื่อมีคำนำหน้าเป็น KM_TAG ระบบจะใช้ 4 บิตแรกของรหัสแท็กเพื่อระบุประเภท
Keymaster 3 เปลี่ยนคำนำหน้า KM_TAG เป็น
Tag::
ประเภทที่เป็นไปได้ ได้แก่
ENUM: ค่าของแท็กจำนวนมากกำหนดไว้ใน
การแจงนับ เช่น ค่าที่เป็นไปได้ของ TAG::PURPOSE
จะกำหนดไว้ใน enum keymaster_purpose_t
ENUM_REP: เหมือนกับ ENUM
ยกเว้นว่าแท็กสามารถทำซ้ำในรายการการให้สิทธิ์ได้ การทำซ้ำ
ระบุค่าที่ได้รับอนุญาตหลายค่า ตัวอย่างเช่น คีย์การเข้ารหัส
น่าจะมี KeyPurpose::ENCRYPT และ
KeyPurpose::DECRYPT
เมื่อ KeyMint สร้างคีย์ ผู้เรียกจะระบุรายการการให้สิทธิ์สำหรับคีย์ Keystore และ KeyMint จะแก้ไขรายการนี้เพื่อเพิ่มข้อจำกัดเพิ่มเติม และ การติดตั้งใช้งาน KeyMint ที่อยู่เบื้องหลังจะเข้ารหัสรายการการให้สิทธิ์สุดท้าย ลงใน KeyBlob ที่ส่งคืน รายการการให้สิทธิ์ที่เข้ารหัสจะเชื่อมโยงกับคีย์บล็อบด้วยการเข้ารหัส เพื่อให้ความพยายามใดๆ ในการแก้ไขรายการการให้สิทธิ์ (รวมถึงการจัดลำดับ) ส่งผลให้คีย์บล็อบไม่ถูกต้องและใช้สำหรับ การดำเนินการเข้ารหัสไม่ได้
การบังคับใช้ด้วยฮาร์ดแวร์เทียบกับการบังคับใช้ด้วยซอฟต์แวร์
การติดตั้งใช้งานฮาร์ดแวร์ที่ปลอดภัยบางอย่างอาจมีฟีเจอร์ไม่เหมือนกัน Keymaster จะแยกความแตกต่างระหว่างการบังคับใช้การควบคุมการเข้าถึงที่ปลอดภัยและไม่ปลอดภัย หรือการบังคับใช้ฮาร์ดแวร์และซอฟต์แวร์ตามลำดับ เพื่อรองรับแนวทางที่หลากหลาย
ซึ่งจะแสดงใน KeyMint API ด้วยฟิลด์ securityLevel
ของ
ประเภท KeyCharacteristics
ฮาร์ดแวร์ที่ปลอดภัยมีหน้าที่ในการวางการให้สิทธิ์ใน
KeyCharacteristics โดยมีระดับการรักษาความปลอดภัยที่เหมาะสมตามสิ่งที่
ฮาร์ดแวร์บังคับใช้ได้ นอกจากนี้ ข้อมูลนี้ยังแสดงใน
บันทึกการรับรองสำหรับคีย์แบบอสมมาตรด้วย โดยลักษณะสำคัญของคีย์
สำหรับ SecurityLevel::TRUSTED_ENVIRONMENT
หรือ SecurityLevel::STRONGBOX จะปรากฏใน
รายการ hardwareEnforced และลักษณะสำคัญ
สำหรับ SecurityLevel::SOFTWARE หรือ
SecurityLevel::KEYSTORE จะปรากฏใน
รายการ softwareEnforced
ตัวอย่างเช่น โดยปกติแล้วสภาพแวดล้อมที่ปลอดภัยจะไม่บังคับใช้ข้อจํากัดเกี่ยวกับช่วงวันที่และเวลาเมื่อใช้คีย์ เนื่องจากไม่มีสิทธิ์เข้าถึงข้อมูลวันที่และเวลาที่เชื่อถือได้ ดังนั้น Keystore ใน Android จะบังคับใช้การให้สิทธิ์ เช่น
Tag::ORIGINATION_EXPIRE_DATETIME และจะมี SecurityLevel::KEYSTORE
ดูข้อมูลเพิ่มเติมเกี่ยวกับการพิจารณาว่าคีย์และการให้สิทธิ์ ได้รับการสนับสนุนจากฮาร์ดแวร์หรือไม่ ได้ที่การรับรองคีย์
การให้สิทธิ์ในการสร้างข้อความที่เข้ารหัส
แท็กต่อไปนี้ใช้เพื่อกำหนดลักษณะการเข้ารหัสของ การดำเนินการโดยใช้คีย์ที่เชื่อมโยง
Tag::ALGORITHMTag::KEY_SIZETag::BLOCK_MODETag::PADDINGTag::CALLER_NONCETag::DIGESTTag::MGF_DIGEST
แท็กต่อไปนี้สามารถทำซ้ำได้ ซึ่งหมายความว่าค่าหลายค่าสามารถเชื่อมโยงกับคีย์เดียวได้
Tag::BLOCK_MODETag::PADDINGTag::DIGESTTag::MGF_DIGEST
ระบบจะระบุค่าที่จะใช้ในเวลาที่ดำเนินการ
วัตถุประสงค์
คีย์มีชุดวัตถุประสงค์ที่เชื่อมโยงกัน ซึ่งแสดงเป็นรายการการให้สิทธิ์อย่างน้อย 1 รายการที่มีแท็ก Tag::PURPOSE ซึ่งกำหนดวิธีใช้คีย์ วัตถุประสงค์กำหนดไว้ใน
KeyPurpose.aidl
โปรดทราบว่าค่าวัตถุประสงค์บางชุดอาจทำให้เกิดปัญหาด้านความปลอดภัย ตัวอย่างเช่น คีย์ RSA ที่ใช้ได้ทั้งเข้ารหัสและลงนามจะอนุญาตให้ผู้โจมตีที่สามารถโน้มน้าวให้ระบบถอดรหัสข้อมูลที่กำหนดเองสร้างลายเซ็นได้
การนำเข้าคีย์
Keymaster รองรับการส่งออกคีย์สาธารณะในรูปแบบ X.509 เท่านั้น และรองรับการนำเข้า รายการต่อไปนี้
- คู่คีย์แบบอสมมาตรในรูปแบบ PKCS#8 ที่เข้ารหัส DER (ไม่มีการเข้ารหัสตามรหัสผ่าน)
- คีย์แบบสมมาตรเป็นไบต์ดิบ
Tag::ORIGIN จะรวมอยู่ในรายการการให้สิทธิ์คีย์ที่เหมาะสม
เพื่อให้มั่นใจว่าคีย์ที่นำเข้าจะแยกความแตกต่างจากคีย์ที่สร้างขึ้นอย่างปลอดภัยได้ ตัวอย่างเช่น หากสร้างคีย์
ในฮาร์ดแวร์ที่ปลอดภัย Tag::ORIGIN จะมีค่า
KeyOrigin::GENERATED อยู่ใน
hw_enforced รายการลักษณะของคีย์ ในขณะที่คีย์
ที่นำเข้าไปยังฮาร์ดแวร์
ที่ปลอดภัยจะมีค่า KeyOrigin::IMPORTED
การตรวจสอบสิทธิ์ของผู้ใช้
การติดตั้งใช้งาน KeyMint ที่ปลอดภัยจะไม่ติดตั้งใช้งานการตรวจสอบสิทธิ์ผู้ใช้ แต่จะ ขึ้นอยู่กับแอปอื่นๆ ที่เชื่อถือได้ซึ่งติดตั้งใช้งานการตรวจสอบสิทธิ์ผู้ใช้ สำหรับอินเทอร์เฟซที่แอปเหล่านี้ ติดตั้งใช้งาน โปรดดูหน้า Gatekeeper
ข้อกำหนดในการตรวจสอบสิทธิ์ผู้ใช้จะระบุผ่านแท็ก 2 ชุด ชุดแรกระบุวิธีการตรวจสอบสิทธิ์ที่อนุญาตให้ใช้คีย์
Tag::USER_SECURE_IDมีค่าตัวเลข 64 บิตที่ระบุ รหัสผู้ใช้ที่ปลอดภัย ซึ่งระบุไว้ในโทเค็นการตรวจสอบสิทธิ์ที่ปลอดภัยเพื่อ ปลดล็อกการใช้คีย์ หากทำซ้ำ คุณจะใช้คีย์ได้หากมีการระบุค่าใดค่าหนึ่ง ในโทเค็นการตรวจสอบสิทธิ์ที่ปลอดภัย
ชุดที่ 2 ระบุว่าผู้ใช้ต้องได้รับการตรวจสอบสิทธิ์หรือไม่และเมื่อใด
หากไม่มีแท็กทั้ง 2 รายการนี้ แต่มี Tag::USER_SECURE_ID
คุณจะต้องตรวจสอบสิทธิ์ทุกครั้งที่ใช้คีย์
Tag::NO_AUTHENTICATION_REQUIREDแสดงว่าไม่จำเป็นต้องมีการตรวจสอบสิทธิ์ผู้ใช้ แม้ว่าการเข้าถึงคีย์จะยังคงจำกัดไว้สำหรับ แอปที่เป็นเจ้าของ (และแอปใดก็ตามที่แอปดังกล่าวให้สิทธิ์เข้าถึง)Tag::AUTH_TIMEOUTคือค่าตัวเลขที่ระบุเป็นวินาที ว่าการตรวจสอบสิทธิ์ผู้ใช้ต้องใหม่เพียงใดจึงจะอนุญาตให้ใช้คีย์ได้ การหมดเวลาจะไม่ข้ามการรีบูต หลังจากรีบูตแล้ว การตรวจสอบสิทธิ์ทั้งหมดจะ ใช้ไม่ได้ คุณตั้งค่าการหมดเวลาเป็นค่าขนาดใหญ่เพื่อระบุว่า ต้องมีการตรวจสอบสิทธิ์ 1 ครั้งต่อการบูต (2^32 วินาทีคือประมาณ 136 ปี ซึ่งคาดว่าอุปกรณ์ Android จะรีบูตบ่อยกว่านั้น)
ต้องใช้อุปกรณ์ที่ปลดล็อกแล้ว
คีย์ที่มี Tag::UNLOCKED_DEVICE_REQUIRED จะใช้ได้เฉพาะในขณะที่
อุปกรณ์ปลดล็อกอยู่ ดูความหมายโดยละเอียดได้ที่
KeyProtection.Builder#setUnlockedDeviceRequired(boolean)
Keystore เป็นผู้บังคับใช้ UNLOCKED_DEVICE_REQUIRED ไม่ใช่ KeyMint อย่างไรก็ตาม ใน Android 12 ขึ้นไป Keystore จะเข้ารหัส
UNLOCKED_DEVICE_REQUIRED เพื่อป้องกันขณะที่อุปกรณ์ล็อกอยู่
เพื่อให้มั่นใจว่าในกรณีส่วนใหญ่ จะไม่สามารถใช้คีย์ได้แม้ว่า Keystore จะถูก
บุกรุกขณะที่อุปกรณ์ล็อกอยู่ก็ตาม
การเข้ารหัสและหมายเลขสุ่มทั้งหมดที่อธิบายไว้ในส่วนนี้ใช้ BoringSSL ยกเว้นในกรณีที่ระบุการใช้ KeyMint อย่างชัดเจน ระบบจะล้างข้อมูลลับทั้งหมด ทันทีที่ไม่มีความจำเป็นอีกต่อไป
คีย์ขั้นสูง UnlockedDeviceRequired
Keystore จะ "เข้ารหัสขั้นสูง" คีย์ UNLOCKED_DEVICE_REQUIRED ก่อนจัดเก็บไว้ในฐานข้อมูลเพื่อปกป้องคีย์ด้วยการเข้ารหัส เมื่อเป็นไปได้ ระบบจะปกป้องคีย์การเข้ารหัสขั้นสูง (คีย์ขั้นสูง) ขณะที่อุปกรณ์ล็อกอยู่ในลักษณะที่กู้คืนได้เฉพาะเมื่อปลดล็อกอุปกรณ์สำเร็จแล้วเท่านั้น (คำว่า "การเข้ารหัสขั้นสูง" ใช้เนื่องจากเลเยอร์การเข้ารหัสนี้จะใช้นอกเหนือจากเลเยอร์การเข้ารหัสที่ KeyMint ใช้กับคีย์ทั้งหมดอยู่แล้ว)
ผู้ใช้แต่ละราย (รวมถึงโปรไฟล์)
มีคีย์ขั้นสูง 2 รายการที่เชื่อมโยงกับ UNLOCKED_DEVICE_REQUIRED ดังนี้
- คีย์ขั้นสูงแบบสมมาตร UnlockedDeviceRequired นี่คือคีย์
AES‑256‑GCM โดยจะเข้ารหัส
คีย์
UNLOCKED_DEVICE_REQUIREDที่นำเข้า สร้างขึ้น หรือใช้ขณะที่อุปกรณ์ปลดล็อกสำหรับผู้ใช้ - คีย์ขั้นสูงแบบอสมมาตรที่ต้องใช้กับอุปกรณ์ที่ปลดล็อก นี่คือคู่คีย์ ECDH
P‑521 โดยจะเข้ารหัส
UNLOCKED_DEVICE_REQUIREDคีย์ที่นำเข้าหรือสร้างขึ้นขณะที่อุปกรณ์ล็อกอยู่สำหรับ ผู้ใช้ ดูรายละเอียดเพิ่มเติมได้ที่การจัดเก็บ คีย์ขณะที่อุปกรณ์ล็อกอยู่
การสร้างและปกป้องคีย์หลัก
เมื่อสร้างผู้ใช้ Keystore จะสร้างคีย์ขั้นสูง UnlockedDeviceRequired ของผู้ใช้และจัดเก็บไว้ในฐานข้อมูลโดยเข้ารหัส (ทางอ้อม) ด้วยรหัสผ่าน สังเคราะห์ของผู้ใช้
- เซิร์ฟเวอร์ของระบบจะสร้างรหัสผ่านของที่เก็บคีย์ของผู้ใช้จากรหัสผ่านสังเคราะห์ของผู้ใช้โดยใช้ KDF ของ SP800‑108
- เซิร์ฟเวอร์ระบบจะส่งรหัสผ่านคีย์สโตร์ของผู้ใช้ไปยังคีย์สโตร์
- Keystore จะสร้างคีย์หลักของผู้ใช้
- สำหรับคีย์ขั้นสูงของผู้ใช้แต่ละราย ให้ทำดังนี้
- คีย์สโตร์จะสร้าง Salt แบบสุ่ม
- คีย์สโตร์จะสร้างคีย์ AES‑256‑GCM จาก รหัสผ่านคีย์สโตร์และ Salt ของผู้ใช้โดยใช้ HKDF‑SHA256
- Keystore จะเข้ารหัสส่วนลับของคีย์หลักโดยใช้คีย์ AES‑256‑GCM นี้
- Keystore จะจัดเก็บคีย์หลักที่เข้ารหัสและ Salt ของคีย์นั้นไว้ในฐานข้อมูล หากเป็นคีย์แบบอสมมาตร ระบบจะจัดเก็บคีย์ครึ่งหนึ่งที่เป็นคีย์สาธารณะโดยไม่เข้ารหัสด้วย
กระบวนการนี้ช่วยให้ถอดรหัสคีย์ขั้นสูงเหล่านี้ได้เมื่อทราบรหัสผ่านสังเคราะห์ของผู้ใช้ เช่น เมื่อผู้ใช้ป้อน PIN, รูปแบบ หรือรหัสผ่านที่ถูกต้อง
นอกจากนี้ Keystore ยังแคชคีย์หลักเหล่านี้ไว้ในหน่วยความจำด้วย ทำให้สามารถดำเนินการกับคีย์ UNLOCKED_DEVICE_REQUIRED ได้ อย่างไรก็ตาม ระบบจะพยายามแคช
ส่วนที่เป็นความลับของคีย์เหล่านี้เฉพาะในขณะที่อุปกรณ์ปลดล็อกสำหรับผู้ใช้เท่านั้น เมื่อ
อุปกรณ์ถูกล็อกสำหรับผู้ใช้ Keystore จะล้างข้อมูลสำเนาที่แคชไว้ของ
ส่วนลับของคีย์หลักเหล่านี้ หากทำได้ กล่าวคือ เมื่ออุปกรณ์ถูกล็อกสำหรับผู้ใช้ Keystore จะเลือกและใช้ระดับการป้องกัน 1 ใน 3 ระดับ
สำหรับคีย์ขั้นสูง UnlockedDeviceRequired ของผู้ใช้
- หากผู้ใช้เปิดใช้เฉพาะ PIN, รูปแบบ หรือรหัสผ่าน Keystore จะล้างส่วนที่เป็นความลับของคีย์หลักที่แคชไว้ ซึ่งจะทำให้กู้คืนคีย์หลักได้ผ่านสำเนาที่เข้ารหัสในฐานข้อมูลเท่านั้น โดยจะถอดรหัสได้ด้วย PIN, รูปแบบ หรือรหัสผ่านที่เทียบเท่าเท่านั้น
- หากผู้ใช้มีเพียงไบโอเมตริกระดับ 3 ("แข็งแกร่ง") และเปิดใช้ PIN, รูปแบบ หรือรหัสผ่าน Keystore จะจัดเตรียมให้สามารถกู้คืนคีย์หลักได้โดยใช้ไบโอเมตริกระดับ 3 ที่ผู้ใช้ลงทะเบียนไว้ (โดยทั่วไปคือลายนิ้วมือ) เพื่อเป็นทางเลือกแทน PIN, รูปแบบ หรือรหัสผ่าน โดยจะ สร้างคีย์ AES‑256‑GCM ใหม่ เข้ารหัสส่วนที่เป็นความลับของ คีย์หลักด้วยคีย์ดังกล่าว นำเข้าคีย์ AES‑256‑GCM ไปยัง KeyMint เป็นคีย์ที่เชื่อมโยงกับข้อมูลไบโอเมตริกซึ่งกำหนดให้ต้องมีการตรวจสอบสิทธิ์ด้วยข้อมูลไบโอเมตริก ให้สำเร็จภายใน 15 วินาทีที่ผ่านมา และล้างสำเนาข้อความธรรมดา ของคีย์ทั้งหมดนี้
- หากผู้ใช้มีไบโอเมตริกคลาส 1 ("สะดวก") ไบโอเมตริกคลาส 2 ("อ่อน")
หรือเปิดใช้ตัวแทนความน่าเชื่อถือในการปลดล็อกที่ใช้งานอยู่ Keystore จะเก็บคีย์หลัก
ที่แคชไว้เป็นข้อความธรรมดา ในกรณีนี้ ระบบจะไม่ให้การรักษาความปลอดภัยด้วยการเข้ารหัสสำหรับ
UNLOCKED_DEVICE_REQUIREDคีย์ ผู้ใช้สามารถ หลีกเลี่ยงการเปลี่ยนไปใช้การสำรองที่มีความปลอดภัยน้อยนี้ได้โดยไม่เปิดใช้การปลดล็อกด้วยวิธีเหล่านี้ วิธีการปลดล็อกที่พบบ่อยที่สุดซึ่งอยู่ในหมวดหมู่เหล่านี้คือการปลดล็อกด้วยใบหน้า ในอุปกรณ์หลายรุ่น และการปลดล็อกด้วยสมาร์ทวอทช์ที่จับคู่ไว้
เมื่อปลดล็อกอุปกรณ์ให้ผู้ใช้แล้ว Keystore จะกู้คืนคีย์หลัก UnlockedDeviceRequired ของผู้ใช้หากเป็นไปได้ สำหรับ PIN, รูปแบบ หรือรหัสผ่าน ที่เทียบเท่ากับการปลดล็อก ระบบจะถอดรหัสสำเนาของคีย์เหล่านี้ที่จัดเก็บไว้ใน ฐานข้อมูล ไม่เช่นนั้น ระบบจะตรวจสอบว่าได้บันทึกสำเนาของคีย์เหล่านี้ที่เข้ารหัสด้วย คีย์ที่เชื่อมโยงกับไบโอเมตริกไว้หรือไม่ หากบันทึกไว้ ระบบจะพยายามถอดรหัส การดำเนินการนี้จะสำเร็จก็ต่อเมื่อผู้ใช้ตรวจสอบสิทธิ์ด้วยไบโอเมตริกระดับ 3 สำเร็จภายใน 15 วินาทีที่ผ่านมา ซึ่งบังคับใช้โดย KeyMint (ไม่ใช่ Keystore)
การจัดเก็บบัตรขณะที่อุปกรณ์ล็อกอยู่
Keystore อนุญาตให้ผู้ใช้นำเข้าและสร้าง
UNLOCKED_DEVICE_REQUIREDคีย์ขณะที่อุปกรณ์ล็อกอยู่ โดยใช้
รูปแบบการเข้ารหัสแบบผสมเพื่อให้มั่นใจว่าข้อมูลจะถอดรหัสได้ก็ต่อเมื่อ
ปลดล็อกอุปกรณ์ในภายหลังเท่านั้น
- การเข้ารหัส (การนำเข้าหรือสร้าง
UNLOCKED_DEVICE_REQUIREDคีย์ขณะที่อุปกรณ์ล็อกอยู่):- Keystore จะสร้างคู่คีย์ ECDH P-521 แบบชั่วคราวใหม่
- Keystore จะสร้างข้อมูลลับที่ใช้ร่วมกันโดยทำข้อตกลงคีย์ ECDH ระหว่าง คีย์ส่วนตัวของคู่คีย์ชั่วคราวนี้กับครึ่งหนึ่งของคีย์สาธารณะของ คีย์หลักแบบอสมมาตรที่ต้องใช้การปลดล็อกอุปกรณ์
- คีย์สโตร์จะสร้าง Salt แบบสุ่ม
- คีย์สโตร์จะสร้างคีย์ AES‑256‑GCM จากข้อมูลลับที่ใช้ร่วมกัน และ Salt โดยใช้ HKDF‑SHA256
- Keystore จะเข้ารหัส
UNLOCKED_DEVICE_REQUIREDโดยใช้คีย์ AES‑256‑GCM นี้ - Keystore จะจัดเก็บคีย์
UNLOCKED_DEVICE_REQUIREDที่เข้ารหัส Salt และครึ่งหนึ่งที่เป็นสาธารณะของคู่คีย์ชั่วคราวไว้ในฐานข้อมูล ของตน
- การถอดรหัส (ใช้
UNLOCKED_DEVICE_REQUIREDคีย์ ที่สร้างขึ้นขณะที่อุปกรณ์ปลดล็อกอยู่):- Keystore จะโหลด
UNLOCKED_DEVICE_REQUIREDคีย์ที่เข้ารหัส, Salt และครึ่งหนึ่งของคีย์สาธารณะของคู่คีย์ชั่วคราวจาก ฐานข้อมูลของตัวเอง - Keystore จะสร้างข้อมูลลับที่ใช้ร่วมกันโดยทำข้อตกลงคีย์ ECDH ระหว่าง ครึ่งหนึ่งของคู่คีย์ชั่วคราวที่เป็นแบบสาธารณะกับครึ่งหนึ่งของ คีย์หลักแบบอสมมาตรที่ต้องปลดล็อกอุปกรณ์ที่เป็นแบบส่วนตัว คีย์ส่วนตัวพร้อมใช้งานเนื่องจากอุปกรณ์ปลดล็อกอยู่
- คีย์สโตร์จะสร้างคีย์ AES‑256‑GCM จากข้อมูลลับที่ใช้ร่วมกัน และ Salt โดยใช้ HKDF‑SHA256 คีย์ AES‑256‑GCM นี้ เหมือนกับคีย์ที่ได้มาในระหว่างการเข้ารหัส
- Keystore จะถอดรหัส
UNLOCKED_DEVICE_REQUIREDโดยใช้ คีย์ AES‑256‑GCM - Keystore จะเข้ารหัส
UNLOCKED_DEVICE_REQUIREDคีย์อีกครั้ง โดยใช้คีย์หลักแบบสมมาตร UnlockedDeviceRequired การดำเนินการนี้ จะไม่ส่งผลต่อคุณสมบัติด้านความปลอดภัยของคีย์ แต่จะช่วยให้เข้าถึงคีย์ได้ รวดเร็วยิ่งขึ้นในภายหลัง
- Keystore จะโหลด
ฟีเจอร์นี้ช่วยให้แอปจัดเก็บข้อมูลได้ขณะที่อุปกรณ์ล็อกอยู่ เพื่อให้ถอดรหัสได้เฉพาะขณะที่อุปกรณ์ปลดล็อกอยู่เท่านั้น โดยแอปควรทำตามขั้นตอนต่อไปนี้
- สร้างคีย์ AES‑256‑GCM นอกคีย์สโตร์
- เข้ารหัสข้อมูลโดยใช้คีย์ AES‑256‑GCM
- นำเข้าคีย์ AES‑256‑GCM ไปยังคีย์สโตร์ด้วยชุดการปกป้องคีย์
setUnlockedDeviceRequired(true) - ล้างข้อมูลสำเนาคีย์ต้นฉบับ
หากต้องการถอดรหัสข้อมูลขณะที่อุปกรณ์ปลดล็อกอยู่ ให้ใช้คีย์ที่ นำเข้าไปยังที่เก็บคีย์
การเชื่อมโยงไคลเอ็นต์
การเชื่อมโยงไคลเอ็นต์ ซึ่งเป็นการเชื่อมโยงคีย์กับแอปไคลเอ็นต์
ที่เฉพาะเจาะจง จะดำเนินการผ่านรหัสไคลเอ็นต์ที่ไม่บังคับและข้อมูลไคลเอ็นต์ที่ไม่บังคับบางอย่าง
(Tag::APPLICATION_ID และ Tag::APPLICATION_DATA
ตามลำดับ) Keystore จะถือว่าค่าเหล่านี้เป็น Blob ที่ทึบแสง โดยจะตรวจสอบว่า Blob เดียวกันที่แสดงในระหว่างการสร้าง/นำเข้าคีย์จะแสดงสำหรับการใช้งานทุกครั้งและเหมือนกันทุกไบต์ KeyMint จะไม่แสดงผลข้อมูลการเชื่อมโยงไคลเอ็นต์
ผู้โทรต้องทราบรหัสผ่านดังกล่าวจึงจะใช้คีย์ได้
ฟีเจอร์นี้ไม่พร้อมใช้งานในแอป
วันหมดอายุ
Keystore รองรับการจำกัดการใช้คีย์ตามวันที่ วันที่เริ่มต้นความถูกต้องของคีย์และ
วันหมดอายุของคีย์จะเชื่อมโยงกับคีย์ได้ และ Keymaster จะปฏิเสธ
ที่จะดำเนินการกับคีย์หากวันที่/เวลาปัจจุบันอยู่นอกช่วงที่ถูกต้อง
ช่วงความถูกต้องของคีย์จะระบุด้วยแท็ก
Tag::ACTIVE_DATETIME
Tag::ORIGINATION_EXPIRE_DATETIME และ
Tag::USAGE_EXPIRE_DATETIME ความแตกต่างระหว่าง "การสร้าง" กับ "การใช้งาน" ขึ้นอยู่กับว่ามีการใช้คีย์เพื่อ "สร้าง" ข้อความ/ลายเซ็น/ฯลฯ ที่เข้ารหัสใหม่ หรือเพื่อ "ใช้" ข้อความ/ลายเซ็น/ฯลฯ ที่เข้ารหัสที่มีอยู่ โปรดทราบว่าความแตกต่างนี้ไม่ได้แสดงต่อแอป
แท็ก Tag::ACTIVE_DATETIME
Tag::ORIGINATION_EXPIRE_DATETIME
และ Tag::USAGE_EXPIRE_DATETIME เป็นแท็กที่ไม่บังคับ หากไม่มีแท็ก
ระบบจะถือว่าคีย์ที่เป็นปัญหา
ใช้ถอดรหัส/ยืนยันข้อความได้เสมอ
เนื่องจากเวลาจริงจะมาจากโลกที่ไม่ปลอดภัย แท็กที่เกี่ยวข้องกับการหมดอายุจึงอยู่ในรายการที่บังคับใช้โดยซอฟต์แวร์
การเชื่อมโยงรูทของความน่าเชื่อถือ
Keystore กำหนดให้ต้องเชื่อมโยงคีย์กับรูทของความน่าเชื่อถือ ซึ่งเป็นบิตสตริง ที่จัดเตรียมไว้ให้ฮาร์ดแวร์ที่ปลอดภัยของ KeyMint ในระหว่างการเริ่มต้นระบบ โดย Bootloader จะเป็นผู้จัดเตรียมให้ สตริงบิตนี้เชื่อมโยงกับการเข้ารหัสกับคีย์ทุกรายการที่ KeyMint จัดการ
รูทของความน่าเชื่อถือประกอบด้วยคีย์สาธารณะที่ใช้เพื่อยืนยันลายเซ็นใน อิมเมจบูตและสถานะการล็อกของอุปกรณ์ หากมีการเปลี่ยนคีย์สาธารณะเพื่ออนุญาตให้ใช้อิมเมจระบบอื่น หรือหากมีการเปลี่ยนสถานะล็อก ระบบจะใช้คีย์ที่ KeyMint ปกป้องซึ่งสร้างโดยระบบก่อนหน้าไม่ได้ เว้นแต่จะมีการกู้คืนรูทของความน่าเชื่อถือก่อนหน้าและบูตระบบที่ลงนามด้วยคีย์นั้น เป้าหมายคือการเพิ่มมูลค่าของ การควบคุมการเข้าถึงคีย์ที่บังคับใช้ด้วยซอฟต์แวร์โดยการป้องกันไม่ให้ ระบบปฏิบัติการที่ผู้โจมตีติดตั้งใช้คีย์ KeyMint
คีย์แบบสแตนด์อโลน
ฮาร์ดแวร์ที่ปลอดภัยของ KeyMint บางรุ่นสามารถเลือกจัดเก็บเนื้อหาคีย์ภายใน
และส่งคืนแฮนเดิลแทนเนื้อหาคีย์ที่เข้ารหัสได้ หรืออาจมีกรณีอื่นๆ ที่ใช้คีย์ไม่ได้จนกว่าจะมีคอมโพเนนต์ระบบที่ไม่ปลอดภัยหรือปลอดภัยอื่นๆ
HAL ของ KeyMint ช่วยให้ผู้เรียกใช้สามารถ
ขอให้คีย์เป็น "แบบสแตนด์อโลน" ผ่านแท็ก TAG::STANDALONE
ซึ่งหมายความว่าไม่จำเป็นต้องใช้ทรัพยากรอื่นนอกเหนือจาก Blob และระบบ KeyMint ที่ทำงานอยู่
คุณตรวจสอบแท็กที่เชื่อมโยงกับคีย์เพื่อดูว่าคีย์เป็นแบบสแตนด์อโลนหรือไม่ ปัจจุบันมีการกำหนดค่าไว้ 2 ค่าเท่านั้น ได้แก่
KeyBlobUsageRequirements::STANDALONEKeyBlobUsageRequirements::REQUIRES_FILE_SYSTEM
ฟีเจอร์นี้ไม่พร้อมใช้งานในแอป
Velocity
เมื่อสร้างแล้ว คุณจะระบุความเร็วในการใช้งานสูงสุดได้
ด้วย TAG::MIN_SECONDS_BETWEEN_OPS
การติดตั้งใช้งาน TrustZone จะปฏิเสธที่จะดำเนินการเข้ารหัสด้วยคีย์ดังกล่าว หากมีการดำเนินการน้อยกว่า TAG::MIN_SECONDS_BETWEEN_OPS วินาทีก่อนหน้านี้
แนวทางที่ง่ายในการใช้ขีดจำกัดความเร็วคือตารางรหัสคีย์และ การประทับเวลาการใช้งานล่าสุด ตารางนี้มีขนาดจำกัด แต่รองรับรายการอย่างน้อย 16 รายการ ในกรณีที่ตารางเต็มและอัปเดตหรือทิ้งรายการไม่ได้ การติดตั้งใช้งานฮาร์ดแวร์ที่ปลอดภัยจะ "ล้มเหลวอย่างปลอดภัย" โดยเลือกที่จะปฏิเสธการดำเนินการกับคีย์ทั้งหมดที่จำกัดความเร็วจนกว่ารายการใดรายการหนึ่งจะหมดอายุ รายการทั้งหมดจะหมดอายุเมื่อรีบูตได้
นอกจากนี้ คุณยังจำกัดคีย์ได้สูงสุด n ครั้งต่อการบูตด้วย
TAG::MAX_USES_PER_BOOT นอกจากนี้ ยังต้องมีตารางการติดตาม
ซึ่งรองรับคีย์อย่างน้อย 4 คีย์และยังทำงานได้อย่างปลอดภัย โปรดทราบว่า
แอปสร้างคีย์ที่จำกัดต่อการรีบูตไม่ได้ ฟีเจอร์นี้
ไม่ได้แสดงผ่าน Keystore และสงวนไว้สำหรับการดำเนินการของระบบ
ฟีเจอร์นี้ไม่พร้อมใช้งานในแอป
การรีซีดโปรแกรมสุ่มตัวเลข
เนื่องจากฮาร์ดแวร์ที่ปลอดภัยจะสร้างตัวเลขสุ่มสำหรับเนื้อหาคีย์และเวกเตอร์การเริ่มต้น (IV) และเนื่องจากเครื่องสร้างตัวเลขสุ่มของฮาร์ดแวร์อาจไม่น่าเชื่อถือได้เสมอไป HAL ของ KeyMint จึงมีอินเทอร์เฟซเพื่อให้ไคลเอ็นต์ระบุเอนโทรปีเพิ่มเติม ซึ่งจะผสมกับตัวเลขสุ่มที่สร้างขึ้น
ใช้ตัวสร้างหมายเลขสุ่มฮาร์ดแวร์เป็นแหล่งที่มาของ Seed หลัก ข้อมูลเริ่มต้นที่ระบุผ่าน API ภายนอกไม่สามารถเป็นแหล่งที่มาเดียว ของความสุ่มที่ใช้ในการสร้างตัวเลขได้ นอกจากนี้ การดำเนินการผสมที่ใช้ต้องรับประกันว่าเอาต์พุตแบบสุ่มจะคาดเดาไม่ได้หากแหล่งที่มาของ Seed ใดแหล่งที่มาหนึ่งคาดเดาไม่ได้