Swift和Kotlin的密钥推导函数库?
Key derivation function library for both Swift and Kotlin?
我正在努力让我的应用程序用户能够将他们的数据与云同步。但是,我计划通过加密他们的数据来安全地执行此操作。我的计划是根据堆栈交换上接受的答案执行以下操作:
https://security.stackexchange.com/questions/157422/store-encrypted-user-data-in-database
- 使用密钥派生函数将用户密码转换为加密密钥
- 使用加密安全伪随机数生成器生成单独的密钥来加密用户数据
- 使用派生密钥加密生成的密钥
- 生成的数据加密密钥密文可以安全地存储在您数据库的用户 table 中
我面临的障碍是密钥推导功能。我有用于 iOS 和 Android 的相同应用程序,想知道是否有一个库可供 iOS (swift) 和 Android (kotlin) 访问。我担心的是,如果我为密钥派生函数使用不同的库,我将无法为 iOS 和 Android 创建相同的密钥,因此用户将无法解密他们的例如,如果他们从使用 Android 切换到 iOS,反之亦然。以前有人 运行 解决过这个问题吗?如果有,您使用了什么库或工具?难道我的担心是多余的,不会有问题吗?我尽量避免使用 KMS,因为我认为那会很昂贵。
I have the same app for iOS and Android and wondering if there is a library that is accessible to iOS (swift) and Android (kotlin).
PKBDF2 应该在 Java / Android 中可用,因此在 Kotlin 中可用。请注意,Java 中的字符处理可能存在差异([=40= 中 char
的 LSB,Android 中的 UTF-8)。
您还可以使用提供更好安全性的 PBKDF 或 scrypt(硬内存)或 Argon2 等功能,但在这种情况下,您需要使用外部库。
无论如何,如果普通用户可以生成或记住密码,密码将永远不会达到 128 位安全性,因此请记住这一点,尤其是 用于离线攻击非常频繁的加密可能。
My worry is that if I use different libraries for the key derivation function, I won’t be able to create the same key for both iOS and Android so the user wouldn’t be able to decrypt their data if they for example switched from using Android to iOS and vice versa.
您的担心部分是没有根据的,因为这些功能遵循已发布的标准,例如在 PBKDF2 的情况下为 PKCS#5。唯一可以(并且将会)经常不同的是功能的配置。字符集编码是一个,但是例如PBKDF2 内部使用的哈希是另一个。
我强烈建议首先使用正确的安全参数配置 PBKDF2,然后尝试用两种语言实现。请记住,让它正常工作并不是安全的主要 objective。你想使用例如SHA-256 或更好和高迭代次数。对于 PBKDF2,您也不希望提取比散列算法提供的输出更多的字节(例如,SHA-256 为 32 个字节)。
无论您做什么,创建一个书面协议,从代码中指向它并且永远不要使用默认算法或值:只需将它们输入即可。只有随机数生成可能最好留给运行时默认设置。
Is my worry unfounded and it won’t be a problem?
部分没有根据:标准化会有所帮助,但配置差异可能会影响您。
I’m trying to avoid using a KMS because I think that would be expensive.
您可能是对的,但由于可能性能问题而放弃更安全的设计似乎为时过早。
我正在努力让我的应用程序用户能够将他们的数据与云同步。但是,我计划通过加密他们的数据来安全地执行此操作。我的计划是根据堆栈交换上接受的答案执行以下操作:
https://security.stackexchange.com/questions/157422/store-encrypted-user-data-in-database
- 使用密钥派生函数将用户密码转换为加密密钥
- 使用加密安全伪随机数生成器生成单独的密钥来加密用户数据
- 使用派生密钥加密生成的密钥
- 生成的数据加密密钥密文可以安全地存储在您数据库的用户 table 中
我面临的障碍是密钥推导功能。我有用于 iOS 和 Android 的相同应用程序,想知道是否有一个库可供 iOS (swift) 和 Android (kotlin) 访问。我担心的是,如果我为密钥派生函数使用不同的库,我将无法为 iOS 和 Android 创建相同的密钥,因此用户将无法解密他们的例如,如果他们从使用 Android 切换到 iOS,反之亦然。以前有人 运行 解决过这个问题吗?如果有,您使用了什么库或工具?难道我的担心是多余的,不会有问题吗?我尽量避免使用 KMS,因为我认为那会很昂贵。
I have the same app for iOS and Android and wondering if there is a library that is accessible to iOS (swift) and Android (kotlin).
PKBDF2 应该在 Java / Android 中可用,因此在 Kotlin 中可用。请注意,Java 中的字符处理可能存在差异([=40= 中 char
的 LSB,Android 中的 UTF-8)。
您还可以使用提供更好安全性的 PBKDF 或 scrypt(硬内存)或 Argon2 等功能,但在这种情况下,您需要使用外部库。
无论如何,如果普通用户可以生成或记住密码,密码将永远不会达到 128 位安全性,因此请记住这一点,尤其是 用于离线攻击非常频繁的加密可能。
My worry is that if I use different libraries for the key derivation function, I won’t be able to create the same key for both iOS and Android so the user wouldn’t be able to decrypt their data if they for example switched from using Android to iOS and vice versa.
您的担心部分是没有根据的,因为这些功能遵循已发布的标准,例如在 PBKDF2 的情况下为 PKCS#5。唯一可以(并且将会)经常不同的是功能的配置。字符集编码是一个,但是例如PBKDF2 内部使用的哈希是另一个。
我强烈建议首先使用正确的安全参数配置 PBKDF2,然后尝试用两种语言实现。请记住,让它正常工作并不是安全的主要 objective。你想使用例如SHA-256 或更好和高迭代次数。对于 PBKDF2,您也不希望提取比散列算法提供的输出更多的字节(例如,SHA-256 为 32 个字节)。
无论您做什么,创建一个书面协议,从代码中指向它并且永远不要使用默认算法或值:只需将它们输入即可。只有随机数生成可能最好留给运行时默认设置。
Is my worry unfounded and it won’t be a problem?
部分没有根据:标准化会有所帮助,但配置差异可能会影响您。
I’m trying to avoid using a KMS because I think that would be expensive.
您可能是对的,但由于可能性能问题而放弃更安全的设计似乎为时过早。