ฟีเจอร์

หน้านี้มีข้อมูลเกี่ยวกับคุณสมบัติการเข้ารหัสของ 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 )
    • โหมดสรุปสำหรับการลงนาม 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 ไปยังฮาร์ดแวร์ที่ปลอดภัย