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:
補丁。
內核版本 | 加密和 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
安卓 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 進行元數據加密,用戶數據的fs_mgr_flags userdata
必須包含以下選項:
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 元數據加密時,這將稍微減少內存使用量。在執行此操作之前,請確認inlinecrypt
掛載選項未在fstab
中指定。如果已指定,請將其刪除,因為 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
中,對於用戶數據集:
forceencrypt=footer
要驗證您的實現是否有效,請提交錯誤報告或運行:
adb root
adb shell dmesg
如果 Adiantum 正確啟用,您應該在內核日誌中看到:
device-mapper: crypt: adiantum(xchacha12,aes) using implementation "adiantum(xchacha12-neon,aes-arm,nhpoly1305-neon)"