Adiantum 是一種加密方法,適用於搭載 Android 9 以上版本的裝置,且其 CPU 缺少 AES 指令。如果您要出貨搭載 ARMv8 加密擴充功能的 ARM 裝置,或搭載 AES-NI 的 x86 裝置,則應不使用 Adiantum。AES 在這些平台上的速度較快。
對於缺少這些 AES CPU 指令的裝置,Adiantum 會在裝置上提供加密功能,且不會造成太多效能開銷。如需基準測試數據,請參閱 Adiantum 論文。如要取得在硬體上執行的基準測試來源,請參閱 GitHub 上的 Adiantum 來源。
如要在搭載 Android 9 以上版本的裝置上啟用 Adiantum,您必須進行核心和使用者空間變更。
核心變更
Android 通用核心 (4.9 以上版本) 支援 Adiantum。
如果裝置的核心尚未支援 Adiantum,請選擇性採用下列變更。如果您無法順利挑選,使用全磁碟加密 (FDE) 的裝置可以排除 fscrypt:
修補程式。
核心版本 | Crypto 和 fscrypt 修補程式 | dm-crypt 修補程式 |
---|---|---|
4.19 | 4.19 核心 | dm-crypt 修補程式
|
4.14 | 4.14 核心 | dm-crypt 修補程式
|
4.9 | 4.9 核心 | dm-crypt 修補程式
|
在核心中啟用 Adiantum
Android 11 以上版本
如果裝置搭載 Android 11 以上版本,請在裝置的核心設定中啟用下列設定:
CONFIG_CRYPTO_ADIANTUM=y CONFIG_FS_ENCRYPTION=y CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y CONFIG_DM_DEFAULT_KEY=y
如果裝置執行 32 位元 ARM 核心,請一併啟用 NEON 指令來提升效能:
CONFIG_KERNEL_MODE_NEON=y CONFIG_CRYPTO_AES_ARM=y CONFIG_CRYPTO_CHACHA20_NEON=y CONFIG_CRYPTO_NHPOLY1305_NEON=y
Android 9 和 10
如果裝置是搭載 Android 9 或 10 版本,則需要略有不同的核心設定。啟用下列設定:
CONFIG_CRYPTO_ADIANTUM=y CONFIG_DM_CRYPT=y
如果裝置使用檔案型加密,請一併啟用下列項目:
CONFIG_F2FS_FS_ENCRYPTION=y
最後,如果裝置執行 32 位元 ARM 核心,請啟用 NEON 指令來提升效能:
CONFIG_KERNEL_MODE_NEON=y CONFIG_CRYPTO_AES_ARM=y CONFIG_CRYPTO_CHACHA20_NEON=y CONFIG_CRYPTO_NHPOLY1305_NEON=y
使用者空間變更
對於搭載 Android 10 以上版本的裝置,Adiantum 使用者空間變更已存在。
針對搭載 Android 9 的裝置,請選擇性採用下列變更:
- cryptfs:新增 Adiantum 支援
- cryptfs:允許設定 dm-crypt 區塊大小
- cryptfs:將 dm-crypt 裝置大小捨入至加密區塊邊界
- cryptfs:改善 dm-crypt 裝置建立作業的記錄功能
- libfscrypt:新增 Adiantum 支援功能
- fs_mgr_fstab:新增 Adiantum 支援
在裝置中啟用 Adiantum
首先,請確認裝置已正確設定 PRODUCT_SHIPPING_API_LEVEL
,以便與啟動時使用的 Android 版本相符。舉例來說,推出時搭載 Android 11 的裝置必須有 PRODUCT_SHIPPING_API_LEVEL := 30
。這點很重要,因為部分加密設定在不同發布版本中具有不同的預設值。
使用檔案型加密的裝置
如要在裝置的內部儲存空間中啟用 Adiantum 檔案加密功能,請在裝置 fstab
檔案中,針對 userdata
區隔的資料列,在最後一欄 (fs_mgr_flags 欄) 中新增下列選項:
fileencryption=adiantum
如果裝置搭載 Android 11 以上版本,則必須啟用中繼資料加密功能。如要使用 Adiantum 在內部儲存空間中加密中繼資料,userdata
的 fs_mgr_flags 也必須包含下列選項:
metadata_encryption=adiantum,keydirectory=/metadata/vold/metadata_encryption
接下來,請在可採用式儲存空間中啟用 Adiantum 加密功能。如要這麼做,請在 PRODUCT_PROPERTY_OVERRIDES
中設定下列系統屬性:
適用於 Android 11 以上版本:
ro.crypto.volume.options=adiantum ro.crypto.volume.metadata.encryption=adiantum
適用於 Android 9 和 10:
ro.crypto.volume.contents_mode=adiantum ro.crypto.volume.filenames_mode=adiantum ro.crypto.fde_algorithm=adiantum ro.crypto.fde_sector_size=4096
最後,您可以視需要將 blk-crypto-fallback.num_keyslots=1
新增至核心指令列。這麼做可在使用 Adiantum 中繼資料加密功能時,稍微降低記憶體用量。執行這項操作前,請先確認 fstab
中未指定 inlinecrypt
掛載選項。如果已指定,請移除,因為 Adiantum 加密不需要此值,且與 blk-crypto-fallback.num_keyslots=1
搭配使用時會導致效能問題。
如要確認導入作業是否成功,請擷取錯誤報告或執行以下操作:
adb root
adb shell dmesg
如果已正確啟用 Adiantum,您應該會在核心記錄檔中看到以下內容:
fscrypt: Adiantum using implementation "adiantum(xchacha12-neon,aes-arm,nhpoly1305-neon)"
如果您已啟用中繼資料加密功能,請一併執行下列指令,驗證是否已正確啟用 Adiantum 中繼資料加密功能:
adb root
adb shell dmctl table userdata
輸出的第三個欄位應為 xchacha12,aes-adiantum-plain64
。
全磁碟加密裝置
如要啟用 Adiantum 並改善其效能,請在 PRODUCT_PROPERTY_OVERRIDES
中設定下列屬性:
ro.crypto.fde_algorithm=adiantum ro.crypto.fde_sector_size=4096
將 fde_sector_size
設為 4096 可提升效能,但並非 Adiantum 運作所需。如要使用這項設定,使用者資料分區必須從磁碟上的 4096 位元組對齊偏移值開始。
在 fstab
中,針對 userdata 設定:
forceencrypt=footer
如要確認導入作業是否成功,請擷取錯誤報告或執行以下操作:
adb root
adb shell dmesg
如果已正確啟用 Adiantum,您應該會在核心記錄檔中看到以下內容:
device-mapper: crypt: adiantum(xchacha12,aes) using implementation "adiantum(xchacha12-neon,aes-arm,nhpoly1305-neon)"