我目前正在Android应用程序上使用AES-ECB加密用户密码,但我必须将此应用程序的数据库连接到一个网站,用户可以在该网站上注册和登录与移动应用程序相同的方式。
我已经读过ECB模式不安全,所以我想通过生成IV来使用CBC。
将IV作为常量存储在代码中是否安全(我也以这种方式存储密钥),无论是在服务器端的php还是应用程序中?
如果没有,网站和移动应用程序是否有办法共享它来加密/解密用户密码?
或者,我可能选择了错误的加密算法,可能有更适合我需要的算法
答案 0 :(得分:4)
最佳做法是为每个加密创建一个新的随机IV。 IV基本上是第一个块中使用的加密调用的种子。
每个IV都可以与密文一起安全地以明文形式存储,以便在解密密文时可用(用于加密的IV必须与用于解密的IV相同)。
答案 1 :(得分:1)
如果您已修复此算法,我可能会建议 - 不要共享IV 从加密结束到解密结束。
虚拟阻挡 在16字节的实际消息块之前添加一个16字节的初始虚拟块。因此,即使您没有将IV共享到Decrypting End,因为AES-CBC是链接模式,Decrypting结束时的第一个块(虚拟块)将被破坏,其余块不会受到影响。
加密结束 根据AES中的CBC模式,在CBC模式中,每个明文块在加密之前与先前的密文块进行异或。 要使每条消息唯一,必须在第一个块中使用初始化向量。 请参阅:http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_Block_Chaining_.28CBC.29
解密结束 使用不正确的IV进行解密会导致第一个明文块损坏,但随后的明文块将是正确的。 这是因为可以从两个相邻的密文块中恢复明文块。