หน้านี้มีข้อมูลเกี่ยวกับคุณสมบัติการเข้ารหัสของ Keystore ใน Android 6.0 ขึ้นไป
พื้นฐานการเข้ารหัส
Keystore จัดเตรียมหมวดหมู่ของการดำเนินการต่อไปนี้:
- การสร้างคีย์
- นำเข้าและส่งออกคีย์แบบอสมมาตร (ไม่มีการหุ้มคีย์)
- การนำเข้าคีย์สมมาตรแบบดิบ (ไม่มีการห่อคีย์)
- การเข้ารหัสและการถอดรหัสแบบไม่สมมาตรด้วยโหมดการเติมที่เหมาะสม
- การลงนามแบบอสมมาตรและการตรวจสอบด้วยโหมดการแยกย่อยและการขยายที่เหมาะสม
- การเข้ารหัสและถอดรหัสแบบสมมาตรในโหมดที่เหมาะสม รวมถึงโหมด AEAD
- การสร้างและการตรวจสอบรหัสการตรวจสอบข้อความแบบสมมาตร
องค์ประกอบโปรโตคอล เช่น วัตถุประสงค์ โหมด และช่องว่างภายใน รวมถึง ข้อจำกัดในการควบคุมการเข้าถึง จะถูกระบุเมื่อมีการสร้างหรือนำเข้าคีย์ และเชื่อมโยงกับคีย์อย่างถาวร เพื่อให้แน่ใจว่าคีย์จะไม่สามารถใช้ในลักษณะอื่นใดได้
นอกเหนือจากรายการข้างต้นแล้ว ยังมีบริการอีกหนึ่งบริการที่การใช้งาน Keymaster มอบให้ แต่ไม่ได้เปิดเผยเป็น API: การสร้างตัวเลขสุ่ม ข้อมูลนี้ใช้ภายในสำหรับการสร้างคีย์ เวกเตอร์การเริ่มต้น (IV) การเติมแบบสุ่ม และองค์ประกอบอื่นๆ ของโปรโตคอลที่ปลอดภัยที่ต้องใช้การสุ่ม
พื้นฐานที่จำเป็น
การใช้งาน Keymaster ทั้งหมดมี:
- อาร์เอสเอ
- รองรับคีย์ 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
)
- อีซีดีเอสเอ
- รองรับคีย์ 224, 256, 384 และ 521 บิต โดยใช้เส้นโค้ง NIST P-224, P-256, P-384 และ P-521 ตามลำดับ
- โหมดสรุปสำหรับ ECDSA:
- ไม่มีสรุป (เลิกใช้แล้ว จะถูกลบออกในอนาคต)
- SHA-256
- เออีเอส
- รองรับคีย์ 128 และ 256 บิต
- CBC , CTR , ECB และ GCM การใช้งาน GCM ไม่อนุญาตให้ใช้แท็กที่เล็กกว่า 96 บิตหรือมีความยาวอื่นที่ไม่ใช่ 96 บิต
- โหมด Padding
PaddingMode::NONE
และPaddingMode::PKCS7
รองรับโหมด CBC และ ECB เมื่อไม่มีการเติม การเข้ารหัสโหมด CBC หรือ ECB จะล้มเหลวหากอินพุตไม่ได้มีขนาดบล็อกหลายเท่า
- HMAC SHA-256 โดยมีขนาดคีย์สูงสุดอย่างน้อย 32 ไบต์
แนะนำให้ใช้ SHA1 และสมาชิกอื่นๆ ในกลุ่ม SHA2 (SHA-224, SHA384 และ SHA512) สำหรับการใช้งาน Keymaster Keystore จัดเตรียมซอฟต์แวร์ไว้หากการใช้งานฮาร์ดแวร์ Keymaster ไม่ได้จัดเตรียมไว้ให้
แนะนำให้ใช้สิ่งพื้นฐานบางอย่างเพื่อให้สามารถทำงานร่วมกับระบบอื่นได้:
- ขนาดคีย์ที่เล็กลงสำหรับ RSA
- เลขชี้กำลังสาธารณะตามอำเภอใจสำหรับ RSA
การควบคุมการเข้าถึงที่สำคัญ
คีย์ที่ใช้ฮาร์ดแวร์ซึ่งไม่สามารถแยกออกจากอุปกรณ์ได้นั้นไม่ได้ให้ความปลอดภัยมากนักหากผู้โจมตีสามารถใช้งานได้ตามต้องการ (แม้ว่าจะมีความปลอดภัยมากกว่าคีย์ที่ สามารถ ถูกขโมยได้ก็ตาม) ดังนั้นจึงจำเป็นอย่างยิ่งที่ Keystore บังคับใช้การควบคุมการเข้าถึง
การควบคุมการเข้าถึงถูกกำหนดให้เป็น "รายการการอนุญาต" ของคู่แท็ก/ค่า แท็กการอนุญาตเป็นจำนวนเต็ม 32 บิต และค่ามีหลายประเภท แท็กบางรายการอาจซ้ำกันเพื่อระบุค่าหลายค่า มีการระบุแท็กที่สามารถทำซ้ำได้หรือไม่ใน เอกสารประกอบสำหรับแท็ก เมื่อสร้างคีย์แล้ว ผู้เรียกจะระบุรายการอนุญาต การใช้ Keymaster ซึ่งอยู่ภายใต้ Keystore จะแก้ไขรายการเพื่อระบุข้อมูลเพิ่มเติมบางอย่าง เช่น คีย์มีการป้องกันการย้อนกลับหรือไม่ และส่งคืนรายการอนุญาต "สุดท้าย" ที่เข้ารหัสลงใน Blob คีย์ที่ส่งคืน ความพยายามในการใช้คีย์สำหรับการดำเนินการเข้ารหัสใดๆ จะล้มเหลว หากมีการแก้ไขรายการอนุญาตขั้นสุดท้าย
สำหรับ Keymaster 2 และเวอร์ชันก่อนหน้า ชุดของแท็กที่เป็นไปได้ถูกกำหนดไว้ใน keymaster_authorization_tag_t
การแจงนับ และได้รับการแก้ไขอย่างถาวร (แม้ว่าจะสามารถขยายได้ก็ตาม) ชื่อนำหน้าด้วย KM_TAG
รหัสแท็กสี่บิตบนสุดใช้เพื่อระบุประเภท
Keymaster 3 เปลี่ยนคำนำหน้า KM_TAG
เป็น Tag::
ประเภทที่เป็นไปได้ ได้แก่:
ENUM
: ค่าของแท็กจำนวนมากถูกกำหนดไว้ในการแจงนับ ตัวอย่างเช่น ค่าที่เป็นไปได้ของ TAG::PURPOSE
ถูกกำหนดไว้ใน enum keymaster_purpose_t
ENUM_REP
: เช่นเดียวกับ ENUM
ยกเว้นแท็กที่สามารถทำซ้ำในรายการการอนุญาต การทำซ้ำระบุค่าที่อนุญาตหลายค่า ตัวอย่างเช่น คีย์เข้ารหัสน่าจะมี KeyPurpose::ENCRYPT
และ KeyPurpose::DECRYPT
UINT
: จำนวนเต็ม 32 บิตที่ไม่ได้ลงนาม ตัวอย่าง: TAG::KEY_SIZE
UINT_REP
: เช่นเดียวกับ UINT
ยกเว้นว่าแท็กสามารถทำซ้ำในรายการการอนุญาต การทำซ้ำระบุค่าที่อนุญาตหลายค่า
ULONG
: จำนวนเต็ม 64 บิตที่ไม่ได้ลงนาม ตัวอย่าง: TAG::RSA_PUBLIC_EXPONENT
ULONG_REP
: เช่นเดียวกับ ULONG
ยกเว้นแท็กที่สามารถทำซ้ำในรายการการอนุญาต การทำซ้ำระบุค่าที่อนุญาตหลายค่า
DATE
: ค่าวันที่/เวลา แสดงเป็นมิลลิวินาทีตั้งแต่วันที่ 1 มกราคม 1970 ตัวอย่าง: TAG::PRIVKEY_EXPIRE_DATETIME
BOOL
: จริงหรือเท็จ แท็กประเภท BOOL
จะถือว่าเป็น "เท็จ" หากไม่มีแท็กและเป็น "จริง" หากมี ตัวอย่าง: TAG::ROLLBACK_RESISTANT
BIGNUM
: จำนวนเต็มความยาวตามอำเภอใจ ซึ่งแสดงเป็นอาร์เรย์ไบต์ตามลำดับจุดสิ้นสุดใหญ่ ตัวอย่าง: TAG::RSA_PUBLIC_EXPONENT
BYTES
: ลำดับของไบต์ ตัวอย่าง: TAG::ROOT_OF_TRUST
การบังคับใช้ฮาร์ดแวร์กับซอฟต์แวร์
การใช้งานฮาร์ดแวร์ที่ปลอดภัยบางประเภทอาจไม่มีคุณสมบัติเหมือนกัน เพื่อสนับสนุนแนวทางที่หลากหลาย Keymaster จะแยกความแตกต่างระหว่างการบังคับใช้การควบคุมการเข้าถึงโลกที่ปลอดภัยและไม่ปลอดภัย หรือการบังคับใช้ฮาร์ดแวร์และซอฟต์แวร์ ตามลำดับ
การใช้งานทั้งหมด:
- บังคับใช้การจับคู่ทุกประการ (ไม่ใช่การบังคับใช้) ของการอนุญาตทั้งหมด รายการการอนุญาตใน Blob คีย์ตรงกับการอนุญาตที่ส่งคืนระหว่างการสร้างคีย์ทุกประการ รวมถึงการเรียงลำดับด้วย ความไม่ตรงกันทำให้เกิดการวินิจฉัยข้อผิดพลาด
- ประกาศการอนุญาตที่มีการบังคับใช้ค่าความหมาย
กลไก API สำหรับการประกาศการอนุญาตที่บังคับใช้ด้วยฮาร์ดแวร์อยู่ในโครงสร้าง keymaster_key_characteristics_t
โดยจะแบ่งรายการการอนุญาตออกเป็นสองรายการย่อย ได้แก่ hw_enforced
และ sw_enforced
ฮาร์ดแวร์ที่ปลอดภัยมีหน้าที่รับผิดชอบในการวางค่าที่เหมาะสมในแต่ละฮาร์ดแวร์ โดยขึ้นอยู่กับสิ่งที่ฮาร์ดแวร์สามารถบังคับใช้ได้
นอกจากนี้ Keystore ยังบังคับใช้การอนุญาต ทั้งหมด โดยใช้ซอฟต์แวร์ ไม่ว่าจะบังคับใช้โดยฮาร์ดแวร์ที่ปลอดภัยหรือไม่ก็ตาม
ตัวอย่างเช่น พิจารณาการใช้งานตาม TrustZone ที่ไม่สนับสนุนการหมดอายุของคีย์ อาจยังคงสร้างคีย์ที่มีวันหมดอายุได้ รายการอนุญาตของคีย์นั้นจะมีแท็ก TAG::ORIGINATION_EXPIRE_DATETIME
พร้อมด้วยวันหมดอายุ การร้องขอไปยัง Keystore สำหรับคุณลักษณะคีย์จะพบแท็กนี้ในรายการ sw_enforced
และฮาร์ดแวร์ที่ปลอดภัยจะไม่บังคับใช้ข้อกำหนดการหมดอายุ อย่างไรก็ตาม ความพยายามในการใช้คีย์หลังจากหมดอายุจะถูกปฏิเสธโดย Keystore
หากอุปกรณ์ได้รับการอัปเกรดด้วยฮาร์ดแวร์ที่ปลอดภัยซึ่งรองรับการหมดอายุ คำขอคุณลักษณะคีย์จะพบ TAG::ORIGINATION_EXPIRE_DATETIME
ในรายการ hw_enforced
และความพยายามในการใช้คีย์หลังจากการหมดอายุจะล้มเหลว แม้ว่าที่เก็บคีย์จะถูกแทนที่หรือข้ามไปในทางใดทางหนึ่ง .
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการพิจารณาว่าคีย์ได้รับการสนับสนุนด้วยฮาร์ดแวร์หรือไม่ โปรดดูที่ การรับรองคีย์
การอนุญาตการสร้างข้อความเข้ารหัส
แท็กต่อไปนี้ใช้เพื่อกำหนดลักษณะการเข้ารหัสของการดำเนินการโดยใช้คีย์ที่เกี่ยวข้อง: TAG::ALGORITHM
, TAG::KEY_SIZE
, TAG::BLOCK_MODE
, TAG::PADDING
, TAG::CALLER_NONCE
และ TAG::DIGEST
TAG::PADDING
, TAG::DIGEST
และ PaddingMode::BLOCK_MODE
สามารถทำซ้ำได้ ซึ่งหมายความว่าค่าหลายค่าอาจเชื่อมโยงกับคีย์เดียว และค่าที่จะใช้จะถูกระบุในเวลาดำเนินการ
วัตถุประสงค์
คีย์มีชุดวัตถุประสงค์ที่เกี่ยวข้องกัน ซึ่งแสดงเป็นรายการการอนุญาตตั้งแต่หนึ่งรายการขึ้นไปพร้อมแท็ก TAG::PURPOSE
ซึ่งกำหนดวิธีการใช้งานคีย์เหล่านั้น วัตถุประสงค์คือ:
-
KeyPurpose::ENCRYPT
-
KeyPurpose::DECRYPT
-
KeyPurpose::SIGN
-
KeyPurpose::VERIFY
คีย์ใดๆ สามารถมีส่วนย่อยของวัตถุประสงค์เหล่านี้ได้ โปรดทราบว่าการรวมกันบางอย่างทำให้เกิดปัญหาด้านความปลอดภัย ตัวอย่างเช่น คีย์ RSA ที่สามารถใช้เพื่อเข้ารหัสและลงนามช่วยให้ผู้โจมตีสามารถโน้มน้าวให้ระบบถอดรหัสข้อมูลที่กำหนดเองเพื่อสร้างลายเซ็นได้
นำเข้าและส่งออก
Keymaster รองรับการส่งออกกุญแจสาธารณะเท่านั้น ในรูปแบบ X.509 และการนำเข้า:
- คู่คีย์สาธารณะและคีย์ส่วนตัวในรูปแบบ PKCS#8 ที่เข้ารหัส DER โดยไม่มีการเข้ารหัสด้วยรหัสผ่าน
- คีย์สมมาตรเป็นไบต์ดิบ
เพื่อให้แน่ใจว่าคีย์ที่นำเข้าสามารถแยกแยะได้จากคีย์ที่สร้างขึ้นอย่างปลอดภัย TAG::ORIGIN
จะรวมอยู่ในรายการการให้สิทธิ์คีย์ที่เหมาะสม ตัวอย่างเช่น หากคีย์ถูกสร้างขึ้นในฮาร์ดแวร์ที่มีการรักษาความปลอดภัย TAG::ORIGIN
ที่มีค่า KeyOrigin::GENERATED
จะพบได้ในรายการ hw_enforced
ของลักษณะเฉพาะของคีย์ ในขณะที่คีย์ที่นำเข้าไปยังฮาร์ดแวร์ที่มีการรักษาความปลอดภัยจะมีค่า KeyOrigin::IMPORTED
การรับรองความถูกต้องของผู้ใช้
การใช้งาน Secure Keymaster จะไม่ใช้การตรวจสอบสิทธิ์ผู้ใช้ แต่ขึ้นอยู่กับแอปที่เชื่อถือได้อื่นๆ ที่ใช้ สำหรับอินเทอร์เฟซที่แอปเหล่านี้ใช้งาน โปรดดูที่ หน้า Gatekeeper
ข้อกำหนดการตรวจสอบสิทธิ์ผู้ใช้ระบุผ่านแท็กสองชุด ชุดแรกระบุว่าผู้ใช้รายใดสามารถใช้คีย์ได้:
-
TAG::ALL_USERS
ระบุว่าคีย์นี้ใช้งานได้โดยผู้ใช้ทุกคน หากมี จะไม่มีTAG::USER_ID
และTAG::USER_SECURE_ID
-
TAG::USER_ID
มีค่าตัวเลขที่ระบุ ID ของผู้ใช้ที่ได้รับอนุญาต โปรดทราบว่านี่คือ ID ผู้ใช้ Android (สำหรับผู้ใช้หลายคน) ไม่ใช่ UID ของแอปพลิเคชัน และบังคับใช้โดยซอฟต์แวร์ที่ไม่ปลอดภัยเท่านั้น ถ้ามีTAG::ALL_USERS
จะไม่ปรากฏ -
TAG::USER_SECURE_ID
มีค่าตัวเลข 64 บิตซึ่งระบุ ID ผู้ใช้ที่ปลอดภัยซึ่งระบุไว้ในโทเค็นการตรวจสอบสิทธิ์ที่ปลอดภัยเพื่อปลดล็อกการใช้คีย์ หากทำซ้ำ อาจใช้คีย์ได้หากมีการระบุค่าใดๆ ไว้ในโทเค็นการตรวจสอบสิทธิ์ที่ปลอดภัย
ชุดที่สองระบุว่าผู้ใช้จำเป็นต้องได้รับการรับรองความถูกต้องหรือไม่และเมื่อใด หากไม่มีแท็กใดเลย แต่ TAG::USER_SECURE_ID
อยู่ จำเป็นต้องมีการตรวจสอบสิทธิ์สำหรับการใช้คีย์ทุกครั้ง
-
NO_AUTHENTICATION_REQUIRED
ระบุว่าไม่จำเป็นต้องมีการตรวจสอบสิทธิ์ผู้ใช้ แม้ว่าคีย์จะยังคงใช้ได้เฉพาะกับแอปที่ทำงานในฐานะผู้ใช้ที่ระบุโดยTAG::USER_ID
เท่านั้น -
TAG::AUTH_TIMEOUT
เป็นค่าตัวเลขที่ระบุในหน่วยวินาทีว่าการตรวจสอบสิทธิ์ผู้ใช้ต้องมีความสดใหม่เพียงใดในการอนุญาตการใช้งานคีย์ สิ่งนี้ใช้ได้กับการดำเนินการคีย์ส่วนตัว/ความลับเท่านั้น การดำเนินการคีย์สาธารณะไม่จำเป็นต้องมีการตรวจสอบสิทธิ์ การหมดเวลาไม่ข้ามการรีบูต หลังจากรีบูต คีย์ทั้งหมดจะ "ไม่ผ่านการรับรองความถูกต้อง" การหมดเวลาอาจถูกตั้งค่าเป็นค่าที่สูงเพื่อระบุว่าจำเป็นต้องมีการรับรองความถูกต้องหนึ่งครั้งต่อการบูต (2^32 วินาทีคือ ~136 ปี อุปกรณ์ Android สันนิษฐานว่าถูกรีบูตบ่อยกว่านั้น)
การผูกมัดลูกค้า
การเชื่อมโยงไคลเอ็นต์ ซึ่งเป็นการเชื่อมโยงคีย์กับแอปพลิเคชันไคลเอ็นต์เฉพาะ จะดำเนินการผ่านรหัสไคลเอ็นต์เพิ่มเติมและข้อมูลไคลเอ็นต์เพิ่มเติมบางส่วน ( TAG::APPLICATION_ID
และ TAG::APPLICATION_DATA
ตามลำดับ) Keystore ถือว่าค่าเหล่านี้เป็น Blob ทึบแสง เพียงแต่ทำให้มั่นใจว่า Blob เดียวกันที่แสดงระหว่างการสร้าง/นำเข้าคีย์จะถูกนำเสนอสำหรับการใช้งานทุกครั้ง และเป็นแบบไบต์ต่อไบต์เหมือนกัน ข้อมูลการเชื่อมโยงไคลเอ็นต์จะไม่ถูกส่งกลับโดย Keymaster ผู้โทรจะต้องทราบจึงจะสามารถใช้กุญแจได้
คุณลักษณะนี้ไม่เปิดเผยต่อแอปพลิเคชัน
หมดอายุ
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 ต้องการให้คีย์เชื่อมโยงกับ root of trust ซึ่งเป็นบิตสตริงที่มอบให้กับฮาร์ดแวร์ที่ปลอดภัยของ Keymaster ในระหว่างการเริ่มต้นระบบ โดยเฉพาะอย่างยิ่งโดยโปรแกรมโหลดบูต บิตสตริงนี้เชื่อมโยงแบบเข้ารหัสกับทุกคีย์ที่จัดการโดย Keymaster
รากฐานของความไว้วางใจประกอบด้วยกุญแจสาธารณะที่ใช้เพื่อตรวจสอบลายเซ็นบนอิมเมจสำหรับบูตและสถานะการล็อคของอุปกรณ์ หากคีย์สาธารณะถูกเปลี่ยนเพื่อให้สามารถใช้อิมเมจระบบอื่นได้ หรือหากสถานะการล็อกมีการเปลี่ยนแปลง คีย์ที่ป้องกันด้วยคีย์มาสเตอร์ที่สร้างโดยระบบก่อนหน้านี้จะไม่สามารถใช้งานได้ เว้นแต่ว่ารากของความไว้วางใจก่อนหน้านี้จะถูกกู้คืนและระบบ ที่ลงนามโดยคีย์นั้นถูกบูท เป้าหมายคือการเพิ่มมูลค่าของการควบคุมการเข้าถึงคีย์ที่บังคับใช้ซอฟต์แวร์โดยทำให้ระบบปฏิบัติการที่ติดตั้งโดยผู้โจมตีไม่สามารถใช้คีย์ Keymaster ได้
กุญแจแบบสแตนด์อโลน
ฮาร์ดแวร์ที่มีการรักษาความปลอดภัยของ Keymaster บางตัวอาจเลือกที่จะจัดเก็บเนื้อหาคีย์ไว้ภายในและส่งคืนหมายเลขอ้างอิง แทนที่จะจัดเก็บเนื้อหาคีย์ที่เข้ารหัส หรืออาจมีกรณีอื่น ๆ ที่ไม่สามารถใช้คีย์ได้จนกว่าจะมีส่วนประกอบของระบบที่ไม่ปลอดภัยหรือระบบรักษาความปลอดภัยอื่น ๆ Keymaster HAL อนุญาตให้ผู้เรียกร้องขอว่าคีย์เป็นแบบ "สแตนด์อโลน" ผ่านทางแท็ก TAG::STANDALONE
ซึ่งหมายความว่าไม่ต้องใช้ทรัพยากรอื่นใดนอกจาก Blob และระบบ Keymaster ที่ทำงานอยู่ แท็กที่เกี่ยวข้องกับคีย์อาจได้รับการตรวจสอบเพื่อดูว่าคีย์เป็นแบบสแตนด์อโลนหรือไม่ ปัจจุบันมีการกำหนดค่าเพียงสองค่าเท่านั้น:
-
KeyBlobUsageRequirements::STANDALONE
-
KeyBlobUsageRequirements::REQUIRES_FILE_SYSTEM
คุณลักษณะนี้ไม่เปิดเผยต่อแอปพลิเคชัน
ความเร็ว
เมื่อสร้างขึ้นแล้ว คุณสามารถระบุความเร็วการใช้งานสูงสุดได้ด้วย TAG::MIN_SECONDS_BETWEEN_OPS
การใช้งาน TrustZone ปฏิเสธที่จะดำเนินการเข้ารหัสลับด้วยคีย์นั้น หากการดำเนินการดำเนินการน้อยกว่า TAG::MIN_SECONDS_BETWEEN_OPS
วินาทีก่อนหน้านี้
วิธีการง่ายๆ ในการใช้ขีดจำกัดความเร็วคือตารางรหัสคีย์และการประทับเวลาใช้งานล่าสุด ตารางนี้อาจมีขนาดจำกัด แต่รองรับได้อย่างน้อย 16 รายการ ในกรณีที่ตารางเต็มและไม่มีรายการใดๆ ที่สามารถอัพเดตหรือละทิ้งได้ ให้รักษาความปลอดภัยการใช้งานฮาร์ดแวร์ "ไม่ปลอดภัย" โดยเลือกที่จะปฏิเสธการดำเนินการคีย์ที่จำกัดความเร็วทั้งหมดจนกว่ารายการใดรายการหนึ่งจะหมดอายุ เป็นที่ยอมรับได้ว่ารายการทั้งหมดจะหมดอายุเมื่อรีบูต
คีย์ยังสามารถจำกัดให้ใช้ n ครั้งต่อการบูตด้วย TAG::MAX_USES_PER_BOOT
นอกจากนี้ยังต้องมีตารางการติดตามซึ่งรองรับได้อย่างน้อยสี่คีย์และไม่ปลอดภัยด้วย โปรดทราบว่าแอปพลิเคชันจะไม่สามารถสร้างคีย์แบบจำกัดต่อการบูตได้ คุณลักษณะนี้ไม่เปิดเผยผ่าน Keystore และสงวนไว้สำหรับการทำงานของระบบ
คุณลักษณะนี้ไม่เปิดเผยต่อแอปพลิเคชัน
เครื่องกำเนิดตัวเลขสุ่มทำการเพาะใหม่
เนื่องจากฮาร์ดแวร์ที่ปลอดภัยสร้างตัวเลขสุ่มสำหรับวัสดุคีย์และเวกเตอร์การเริ่มต้น (IV) และเนื่องจากตัวสร้างตัวเลขสุ่มของฮาร์ดแวร์อาจไม่น่าเชื่อถืออย่างสมบูรณ์เสมอไป Keymaster HAL จึงจัดเตรียมอินเทอร์เฟซเพื่อให้ไคลเอนต์จัดเตรียมเอนโทรปีเพิ่มเติมซึ่งจะผสมเข้ากับการสุ่ม ตัวเลขที่สร้างขึ้น
ใช้ตัวสร้างตัวเลขสุ่มฮาร์ดแวร์เป็นแหล่งเมล็ดพันธุ์หลัก ข้อมูลเริ่มต้นที่จัดทำผ่าน API ภายนอกไม่สามารถเป็นแหล่งที่มาของการสุ่มที่ใช้สำหรับการสร้างตัวเลขเพียงแหล่งเดียว นอกจากนี้ การดำเนินการผสมที่ใช้ต้องแน่ใจว่าเอาต์พุตแบบสุ่มนั้นไม่สามารถคาดเดาได้ หากแหล่งที่มาของเมล็ดใดๆ ไม่สามารถคาดเดาได้
คุณลักษณะนี้ไม่เปิดเผยต่อแอปพลิเคชัน แต่ถูกใช้โดยเฟรมเวิร์ก ซึ่งให้เอนโทรปีเพิ่มเติมเป็นประจำ ซึ่งดึงมาจากอินสแตนซ์ Java SecureRandom ไปยังฮาร์ดแวร์ที่ปลอดภัย