最佳实践:Android KeyStore 使用哪些 AES 设置
Best Practice: Which AES settings to use for Android KeyStore
Android KeyStore 提供了完整的可用列表 ciphers,这让我想到了以下问题:哪种组合是 2019 年使用的最佳实践?每个组合似乎都有其自身的一系列缺点,作为一个不是安全专家的人,真的很难决定使用哪个。
一些背景信息:
我正在开发基于 Kotlin 的 Android 应用程序,该应用程序连接到 API。用户必须提供一对 username:password 以向 API 进行身份验证,然后它将 return 一个十六进制承载令牌用于将来的身份验证。到 API 的连接已经经过 TLS 加密,因此这里不需要额外加密。
问题是安全地存储信息。必须安全地存储用户名、密码和不记名令牌。这个问题的一个常见解决方案似乎是加密凭据并通过首选项 API 存储它们。由于加密只发生在应用程序内部,不需要密钥交换,因此对称密钥加密看起来是可行的方法。
TL; DR:更喜欢AES/GCM/NoPadding
。永远不要使用 AES/ECB/*
.
在您的情况下,您会更喜欢经过身份验证的对称加密,并且在您 link 的列表中提供此功能的唯一选项是 AES/GCM/NoPadding
。
这里对您的好处是,您的数据不仅被加密,而且不会被篡改 - 如果有人或某物修改了存储的数据,您将在尝试解密时遇到异常。其他列出的模式没有这个 属性。这意味着存储的密文可能会被修改,而你不知道 - 它可能会或可能不会解密(我说可能会或可能不会,因为它在其他情况下会抛出异常,比如修改后的填充错误)。
缺点(而且不是很大)是您必须确保永远不会同时使用相同的密钥和随机数。如果这样做 - 并且攻击者可以访问或查看两组不同的密文 - 他们破解和解密就变得微不足道了。解决此问题的最简单方法是简单地 始终生成一个随机数 。在 运行 遇到任何问题之前,您将能够加密 2^96
次!
如果您出于某种原因不能或不想使用 AES/GCM/NoPadding
,请从 AES/CTR/NoPadding
或 AES/CBC/PKCS7Padding
中选择 select。两者都有各自的缺点。您需要找到一种防止篡改自己的方法(通常使用 HMAC)。我倾向于选择 AES/CTR/NoPadding
,因为它与 AES/GCM/NoPadding
.
非常相似(至少在使用上如此)
最后,不要使用任何与 ECB 相关的东西。 欧洲央行坏账.
Android KeyStore 提供了完整的可用列表 ciphers,这让我想到了以下问题:哪种组合是 2019 年使用的最佳实践?每个组合似乎都有其自身的一系列缺点,作为一个不是安全专家的人,真的很难决定使用哪个。
一些背景信息: 我正在开发基于 Kotlin 的 Android 应用程序,该应用程序连接到 API。用户必须提供一对 username:password 以向 API 进行身份验证,然后它将 return 一个十六进制承载令牌用于将来的身份验证。到 API 的连接已经经过 TLS 加密,因此这里不需要额外加密。 问题是安全地存储信息。必须安全地存储用户名、密码和不记名令牌。这个问题的一个常见解决方案似乎是加密凭据并通过首选项 API 存储它们。由于加密只发生在应用程序内部,不需要密钥交换,因此对称密钥加密看起来是可行的方法。
TL; DR:更喜欢AES/GCM/NoPadding
。永远不要使用 AES/ECB/*
.
在您的情况下,您会更喜欢经过身份验证的对称加密,并且在您 link 的列表中提供此功能的唯一选项是 AES/GCM/NoPadding
。
这里对您的好处是,您的数据不仅被加密,而且不会被篡改 - 如果有人或某物修改了存储的数据,您将在尝试解密时遇到异常。其他列出的模式没有这个 属性。这意味着存储的密文可能会被修改,而你不知道 - 它可能会或可能不会解密(我说可能会或可能不会,因为它在其他情况下会抛出异常,比如修改后的填充错误)。
缺点(而且不是很大)是您必须确保永远不会同时使用相同的密钥和随机数。如果这样做 - 并且攻击者可以访问或查看两组不同的密文 - 他们破解和解密就变得微不足道了。解决此问题的最简单方法是简单地 始终生成一个随机数 。在 运行 遇到任何问题之前,您将能够加密 2^96
次!
如果您出于某种原因不能或不想使用 AES/GCM/NoPadding
,请从 AES/CTR/NoPadding
或 AES/CBC/PKCS7Padding
中选择 select。两者都有各自的缺点。您需要找到一种防止篡改自己的方法(通常使用 HMAC)。我倾向于选择 AES/CTR/NoPadding
,因为它与 AES/GCM/NoPadding
.
最后,不要使用任何与 ECB 相关的东西。 欧洲央行坏账.