C# 在Android应用程序中,在哪里存储解密所需的IV?
我应该将AES解密所需的IV(字节数组)存储在我的Android应用程序的何处?我尝试将其转换为Base64中的字符串,并将其保存到共享首选项,但不断出现错误的填充异常。我试着换衬垫,但没用 我还将IV(字节数组)保存到密钥库的提供程序中,这也起到了作用,但在Visual Studio for Mac中调试时,每次运行应用程序时,提供程序的内容(在本例中为IV)都会被擦除。提供程序仍然存在,但未在提供程序中保存任何内容。Android的文档中说,“每个提供商……都是在其安装的每个运行时配置的。”一旦应用程序安装到实际设备上,这会成为一个问题吗 我正在Visual Studio for Mac中用c#编写代码 编辑 这是我使用Base64编码的代码: 字符串ivString=Base64.EncodeToString(ivByteArray,Base64Flags.Default) 字节[]decodedIV=Base64.Decode(ivString,Base64Flags.Default) 当我打印出原始字节数组和解码后的字节数组时,它们完全相同,但我不断得到一个错误的填充异常 我正在使用AES、CBC和EncryptionPaddingPkcs7 我尝试将其转换为Base64中的字符串,并将其保存到共享首选项,但不断出现错误的填充异常 将IV存储在SharedReference中应该可以工作。您可能遇到了base64编码问题 我还将IV(字节数组)保存到密钥库的提供程序中,这也起到了作用,但在Visual Studio for Mac中调试时,每次运行应用程序时,提供程序的内容(在本例中为IV)都会被擦除C# 在Android应用程序中,在哪里存储解密所需的IV?,c#,android,aes,keystore,initialization-vector,C#,Android,Aes,Keystore,Initialization Vector,我应该将AES解密所需的IV(字节数组)存储在我的Android应用程序的何处?我尝试将其转换为Base64中的字符串,并将其保存到共享首选项,但不断出现错误的填充异常。我试着换衬垫,但没用 我还将IV(字节数组)保存到密钥库的提供程序中,这也起到了作用,但在Visual Studio for Mac中调试时,每次运行应用程序时,提供程序的内容(在本例中为IV)都会被擦除。提供程序仍然存在,但未在提供程序中保存任何内容。Android的文档中说,“每个提供商……都是在其安装的每个运行时配置的。”
java.security.Provider
它不是存储bytearray的地方。你的意思是或其他的执行。请具体说明
在Android应用程序中,在哪里存储解密所需的IV
只需在密文前面加上初始化向量
[IV][ciphertext]
我使用了
SharedReferences
在Base64
编码中存储IV
,它工作正常。你可能在某个地方出错了。即使不是在c#中,在Java中。将IV存储在“某处”只会使事情变得更复杂,只需将其预先添加到加密文本中,它不需要保密。存储IV的代码似乎不是问题。显示加密和解密代码以及如何存储AESkey@HarminderKaur回答说:“只需在密文前面加上初始化向量,”IV不需要是机密的,只需是唯一的,如随机值。@HarminderKaur,如果您是不安全的加密密码。不要加密密码,当攻击者获得DB时,他也将获得加密密钥。另外,仅仅使用散列函数是不够的,仅仅添加一个salt对提高安全性几乎没有作用。使用诸如PBKDF2
,Rfc2898DeriveBytes
,Argon2
,password\u hash
,Bcrypt
之类的函数,或者使用大约100ms CPU时间的类似函数。重点是让攻击者花费大量时间通过暴力手段查找密码。