Java加密:在我的AES/CBC/PKCS5P添加场景中使用什么种子

Java加密:在我的AES/CBC/PKCS5P添加场景中使用什么种子,java,encryption,cryptography,block-cipher,secure-random,Java,Encryption,Cryptography,Block Cipher,Secure Random,我正在构建一个应用程序,它将使用AES/CBC/PKCS5P添加方法来加密用户设备上的数据,安全性非常重要。我想防止暴力攻击,以防有人获得数据库 表中的每一行都有一个关联的标题。我不知道用什么做种子。我可以执行以下操作之一: 在源代码中硬编码我自己的种子,但我相信如果有人反编译我的应用程序,这是可以阅读的 使用用户输入的标题作为种子 使用我自己的种子以及输入的标题的串联 除非有其他方法,否则在上述所有场景中,我可以想象有人找到了种子。这对他们能够暴力破解加密数据有用吗?当然,在上述所有场景中,我

我正在构建一个应用程序,它将使用AES/CBC/PKCS5P添加方法来加密用户设备上的数据,安全性非常重要。我想防止暴力攻击,以防有人获得数据库

表中的每一行都有一个关联的标题。我不知道用什么做种子。我可以执行以下操作之一:

  • 在源代码中硬编码我自己的种子,但我相信如果有人反编译我的应用程序,这是可以阅读的

  • 使用用户输入的标题作为种子

  • 使用我自己的种子以及输入的标题的串联

  • 除非有其他方法,否则在上述所有场景中,我可以想象有人找到了种子。这对他们能够暴力破解加密数据有用吗?当然,在上述所有场景中,我还将用户密码作为密钥的一部分

    我怎样才能让潜在的黑客更难对付

    编辑(重新编辑)

    基于以下回复以及我的研究和思考过程。我想我可以做到以下几点

  • 让用户输入密码,但不要将其存储在数据库中
  • 在存储敏感数据之前,他们必须输入一个标签来识别它。我将以明文形式存储在数据库中,并将其用作salt
  • 我将使用用户的密码和带有PBKDF2的标签来生成密钥,但不会存储它
  • 我将使用#3生成的密钥加密敏感数据
  • 要解密,我将再次根据用户的密码和行标签生成密钥,并使用它来解密敏感数据
  • 这听起来对吗?若一个黑客用两列(标记明文和加密数据)获得数据库,他能推断出什么吗

    编辑2

    我计划建立一个Android应用程序,具体来说,以下链接是我所需要的


    这里的问题是,每当有人对您的应用程序进行反编译时,生成密钥的方法就不为人知了。因此,如果该密钥生成的所有输入数据都是已知的,那么生成该密钥就很简单了

    因此,您可能希望向用户提供输入将与AES加密一起使用的密码短语的可能性。确保您使用了一个系统,例如,以使强制使用密码短语变得困难


    如果您的数据库不是存储在用户的设备上,而是存储在外部,那么您可以在设备上生成并存储数据,并在数据实际存储到中央数据库之前对数据进行加密。

    根据我的评论和您的编辑,一个可能的解决方案可以归结为这一点(我不是真正的Java程序员,但下面的伪代码应该很清楚):


    aesKey Padding不是加密…你的加密方法/库究竟是什么?种子是什么意思?@LukePark我指的是用于加密/解密的私钥。我将其转换为字节,并将其传递给…SecureRandom.setSeed(字节[]种子)我觉得您可以从对加密主题的进一步研究中获益。仅客户端加密应该执行类似于以下操作:使用用户密码生成AES密钥和HMAC密钥。使用SHA512的PBKDF2适合此操作。生成随机IV。使用AES密钥进行对称加密并使用HMAC(HMAC-SHA256适合)对密文和IV进行身份验证。如果您使用的是GCM模式或其他身份验证模式,则不需要HMAC。@LukePark请提供一个示例代码或在线教程来实现您的建议。我无法完全理解您的意思。以下是我的想法。我将向用户询问密码和encryp在数据库中输入我自己的密码(例如:MySecretKey)。当用户下次打开应用程序时,它将询问密码并检查我的上述加密值是否被解密为“MySecretKey”使用输入密码。如果是,那么我将使用该密钥进一步加密其他需要加密的数据。PBKDF2是否比AES-256位强?wiki似乎说暴力强制非常便宜。@ShahidThaika PBKDF是一个哈希函数,它是(应该是)性能昂贵,并且从用户提供的(较弱的)密码生成AES加密的可用密钥。
    
    aesKey <- PBKDF2-SHA512(userPassword)[:32]
    hmacKey <- PBKDF2-SHA512(userPassword)[32:] // PBKDF2-SHA512 has a natural 64 byte output
    
    iv <- CSPRNG(16) // 16 byte IV for AES from a CSPRNG
    ciphertext <- AES256CBC(plainText, aesKey, iv) // Use PKCS5Padding
    
    result <- iv + ciphertext // Prepend the IV.
    result <- HMAC-SHA256(result, hmacKey) + result
    // Prepend the HMAC of the IV and ciphertext using the hmacKey.  Always encrypt THEN mac.