Android 官方推荐使用 Jetpack Security 进行数据加密

Andrew2020-08-18 17:39:29

插图由Virginia Poltrack

作为一名开发人员,您希望确保数据的安全,并使其掌握在打算使用的一方手中。但是,如果你像大多数Android开发者一样,你没有专门的安全团队来帮助正确加密你的应用程序的数据。通过搜索Web来了解如何加密数据,您可能会得到一些已经过时好几年的答案,并提供错误的示例。

Jetpack Security(JetSec)加密库对Files和SharedPreferences读写进行加密解密处理。该库促进了AndroidKeyStore的使用,同时使用了安全且众所周知的加密原语。使用EncryptedFile和EncryptedSharedPreferences可让您本地保护可能包含敏感数据,API密钥,OAuth令牌和其他类型机密的文件

Jetpack Security基于Tink,它是Google的一个开源,跨平台安全项目。如果您需要常规加密、混合加密或类似的加密,Tink可能是合适的。Jetpack Security数据结构与Tink完全兼容。

密钥生成

Jetpack Security使用一个主密钥,该主密钥对用于每个加密操作的所有子密钥进行加密。JetSec在MasterKeys类中提供了推荐的默认主密钥。此类使用基本的AES256-GCM密钥,该密钥已生成并存储在AndroidKeyStore中。AndroidKeyStore是一个在TEE或StrongBox中存储加密密钥的容器,这使得它们很难提取。子项存储在可配置的SharedPreferences对象中。

首先,我们使用Jetpack Security中的AES256_GCM_SPEC规范,推荐用于一般用例。AES256-GCM是对称的,在现代设备上通常速度很快。

val keyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC

对于需要更多配置或处理非常敏感数据的应用,建议构建您的KeyGenParameterSpec,选择适合您使用的选项。带有BiometricPrompt的时限密钥可以提供更高级别的保护,以防止设备被盗用。

重要选项:

  • userAuthenticationRequired()userAuthenticationValiditySeconds()用于创建有时间限制的密钥。限时密钥需要BiometricPrompt用于对称密钥的加密和解密的授权。
  • unlockedDeviceRequired()设置一个标志,该标志有助于确保在设备未解锁的情况下不会发生密钥访问。此标志在Android Pie及更高版本中可用。
  • 使用setIsStrongBoxBacked(),可以在功能更强大的单独芯片上运行加密操作。这对性能有轻微影响,但更安全。它可以在一些运行Android Pie或更高版本的设备上使用。

注意:如果您的应用需要在后台加密数据,你不应该使用有时间限制的密钥或要求设备解锁,因为如果没有用户在场,你将无法完成这一任务。

// Custom Advanced Master Key
val advancedSpec = KeyGenParameterSpec.Builder(
    "master_key",
    KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
).apply {
    setBlockModes(KeyProperties.BLOCK_MODE_GCM)
    setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
    setKeySize(256)
    setUserAuthenticationRequired(true)
    setUserAuthenticationValidityDurationSeconds(15) // must be larger than 0
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        setUnlockedDeviceRequired(true)
        setIsStrongBoxBacked(true)
    }
}.build()

val advancedKeyAlias = MasterKeys.getOrCreate(advancedSpec)

解锁有时间限制的密钥

如果您的密钥是使用以下选项创建的,则必须使用BiometricPrompt对设备进行授权:

  • userAuthenticationRequired is true
  • userAuthenticationValiditySeconds > 0

用户验证后,将在有效秒字段中设置的时间量内解锁密钥。AndroidKeystore没有用于查询键设置的API,因此您的应用必须跟踪这些设置。您应该使用onCreate()将对话框呈现给用户的活动方法来构建BiometricPrompt实例。

用于解锁时间限制密钥的BiometricPrompt代码:

// Activity.onCreate

val promptInfo = PromptInfo.Builder()
    .setTitle("Unlock?")
    .setDescription("Would you like to unlock this key?")
    .setDeviceCredentialAllowed(true)
    .build()

val biometricPrompt = BiometricPrompt(
    this, // Activity
    ContextCompat.getMainExecutor(this),
    authenticationCallback
)

private val authenticationCallback = object : AuthenticationCallback() {
        override fun onAuthenticationSucceeded(
            result: AuthenticationResult
        ) {
            super.onAuthenticationSucceeded(result)
            // Unlocked -- do work here.
        }
        override fun onAuthenticationError(
            errorCode: Int, errString: CharSequence
        ) {
            super.onAuthenticationError(errorCode, errString)
            // Handle error.
        }
    }

To use:
biometricPrompt.authenticate(promptInfo)

加密文件

Jetpack Security包含一个EncryptedFile类,它消除了加密文件数据的挑战。与File类似,EncryptedFile提供一个FileInputStream对象用于读取,一个FileOutputStream对象用于写入。使用流式AEAD(遵循OAE2定义)对文件进行加密。数据被分为多个块,并使用AES256-GCM进行加密,从而无法重新排序。

val secretFile = File(filesDir, "super_secret")
val encryptedFile = EncryptedFile.Builder(
    secretFile,
    applicationContext,
    advancedKeyAlias,
    FileEncryptionScheme.AES256_GCM_HKDF_4KB)
    .setKeysetAlias("file_key") // optional
    .setKeysetPrefName("secret_shared_prefs") // optional
    .build()

encryptedFile.openFileOutput().use { outputStream ->
    // Write data to your encrypted file
}

encryptedFile.openFileInput().use { inputStream ->
    // Read data from your encrypted file
}

加密SharedPreferences

如果您的应用程序需要保存Key-value(例如 API 密钥),JetSec提供EncryptedSharedPreferences类,它使用与您习惯的SharedPreferences接口相同的接口。

Key和value均被加密。密钥使用提供确定性密文的AES256-SIV-CMAC加密。值使用AES256-GCM加密,并绑定到加密密钥。此方案允许对密钥数据进行安全加密,同时仍然允许查找。

EncryptedSharedPreferences.create(
    "my_secret_prefs",
    advancedKeyAlias,
    applicationContext,
    PrefKeyEncryptionScheme.AES256_SIV,
    PrefValueEncryptionScheme.AES256_GCM
).edit {
    // Update secret values
}
android开发加密芯片
本作品采用《CC 协议》,转载必须注明作者和本文链接
带有高通芯片的智能手机会秘密向高通发送个人数据。
用Rust开发代码不仅能避免很多常见的安全漏洞类型,而且最终会对全球网络安全基线产生重大影响。但是,一种名为Rust的安全编程语言正在快速崛起,逆转软件安全的宿命。自2019年以来,微软、谷歌和亚马逊网络服务一直在使用Rust,这三家公司于2020年与Mozilla和华为成立了非营利性Rust基金会,以支持和发展该语言。
Operation(верность)mercenary:陷阵于东欧平原的钢铁洪流、Bitter组织使用“Dracarys”Android间谍软件……
2021年5月18日,《美国创新与竞争法案》(United States Innovation and Competition Act of 2021)通过,由芯片和ORAN5G紧急拨款、《无尽前沿法案》、《2021战略竞争法案》、国土安全和政府事务委员会相关条款、《2021迎接中国挑战法案》和其他事项六部分构成。该法案进一步强化了《无尽前沿法案》提出的在科技领域赢得与中国的竞争的目标,提出了十大
瑞士之密码安全
2021-11-29 13:46:11
瑞士作为一个欧洲小国,尽管自然资源匮乏,但蜚声海内外的除全球知名的钟表外还有个就是军刀了,精巧、犀利、功能全面给人印象深刻,这种对产品的设计哲学和产品灵魂注入,深入骨髓,而这种灵魂在密码安全产品方面一脉相承,尽展无余。
全球信息技术创新日益加快,以大数据、云计算、物联网、人工智能、区块链为代表的新一代信息技术蓬勃发展。其中,网络安全成为其发展的重要前提。网络安全技术的发展更是新一代信息技术进步的重要表现,如何有效开发网络安全项目也就成为网络资源开发主要思考的重要方向。本文梳理了自1月份以来的全球信息通信与网络安全技术发展动态,帮助读者了解最新的发展概况。
近年来,以智能手机及其周边设备为代表的智能移动终端迅速普及,但涉及智能移动终端信息安全问题的相关报道也呈现上升趋势。通过以当前智能移动终端与信息安全发展现状为出发点,梳理智能移动终端信息安全功能的发展历史,总结平台结构的主要特征,论述了智能移动终端信息安全风险现状及对策,展望未来信息安全风险的研究方向。
10月23日,看雪第五届安全开发者峰会于上海举办,欢迎各位莅临现场!
Kosher表示,卫星只是反射它们发送的任何信号。印度军方现在正计划购买这项技术并将其投入使用。印度陆军称QKD的工作“对现代战争产生了毁灭性的影响”。QKD可以使印度军队成为其他武装力量中的佼佼者。并且可以通过指示密钥已被泄露因此不应使用的信号来检测此更改。Verizon的数据泄露调查报告 指出, 近50%的数据泄露是由于凭证盗窃造成的。
Andrew
暂无描述