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:新增鐵線蕨支持
在您的裝置中啟用鐵線蕨
首先,請確保您的裝置已正確設定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
中,對於使用者資料集:
forceencrypt=footer
若要驗證您的實作是否有效,請取得錯誤報告或運行:
adb root
adb shell dmesg
如果 Adiantum 正確啟用,您應該在核心日誌中看到以下內容:
device-mapper: crypt: adiantum(xchacha12,aes) using implementation "adiantum(xchacha12-neon,aes-arm,nhpoly1305-neon)",
Adiantum 是一種加密方法,專為運行 Android 9 及更高版本且 CPU 缺少AES指令的裝置而設計。如果您要交付具有 ARMv8 加密擴充功能的基於 ARM 的設備或具有 AES-NI 的基於 x86 的設備,則不應使用 Adiantum。 AES 在這些平台上速度更快。
對於缺乏這些 AES CPU 指令的設備,Adiantum 在您的裝置上提供加密,效能開銷非常小。有關基準數據,請參閱Adiantum 論文。若要在您的硬體上執行基準測試來源,請參閱GitHub 上的 Adiantum 來源。
要在運行 Android 9 或更高版本的裝置上啟用 Adiantum,您需要進行核心變更和使用者空間變更。
核心變化
Adiantum 受 Android 通用核心 4.9 及更高版本的支援。
如果您的裝置核心尚未支援 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:新增鐵線蕨支持
在您的裝置中啟用鐵線蕨
首先,請確保您的裝置已正確設定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
中,對於使用者資料集:
forceencrypt=footer
若要驗證您的實作是否有效,請取得錯誤報告或運行:
adb root
adb shell dmesg
如果 Adiantum 正確啟用,您應該在核心日誌中看到以下內容:
device-mapper: crypt: adiantum(xchacha12,aes) using implementation "adiantum(xchacha12-neon,aes-arm,nhpoly1305-neon)"