首页 > 解决方案 > 可加密密码的最大长度

问题描述

我正在使用 PBEWithMD5AndDES 算法来加密密码。我需要将加密密码存储在 db 列中。根据密码长度,我必须决定 db 列的长度。我想知道可以使用上述算法加密的密码的最大长度是多少。

标签: encryptioncryptographypassword-encryption

解决方案


  1. 如果这是用于访问系统上某些内容的密码,则根本不应将其加密存储,而应存储不可逆且缓慢的哈希,有时伪装成 PBKDF(基于密码的密钥派生函数)。这提供了更好的安全性,这对于 SO 来说是题外话,但已经在 security.SX 上详细讨论了数千次,在 crypto.SX 上的讨论程度略低。有关规范和许多链接,请参阅https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords 。

  2. 如果你确实需要加密存储,PBEwithMD5andDES 是不安全的。您使用此算法加密存储的任何值最多可以在几小时内被有能力的攻击者轻松解密,甚至可能在几秒钟内被有能力的攻击者解密,因此几乎不值得加密。

  3. 那些说,回答你问的唯一一个问题:使用这种算法可以不安全地加密的数据大小没有固有的限制。与所有 JavaCipher实例一样,它使用一种init, update, doFinal结构,尽管 Java 语言将byte[]在一次调用中传递或返回的参数的大小限制为略小于 2^31(约 2,100,000,000)字节,但您可以进行任意数量的调用。(对于安全密码,数据大小有一些限制,具体取决于算法和模式,以保持安全,但由于此密码一开始并不安全,因此不会因超出可能降低安全性的数据大小而丢失任何内容。)

    处理更多数据将花费越来越多的时间,因为此密码使用 CBC 模式,加密时无法并行化或流水线化。我还没有测量过,无论如何它会根据您的硬件以及在某种程度上您的 Java 版本而有所不同,但例如,如果您想加密 1,000,000,000,000,000,000 个字节,它可能需要 300,000 年的时间。您的计算机可能不会持续那么久。

    OTOH 因为您想将结果存储在数据库中,所以几乎可以肯定会有一些限制。即使没有架构限制,或者没有有效的限制,每个数据库最终都会受到它可以使用的磁盘或等效存储大小的限制,并且数据中心中所有存储的总数(当然不是全部)估计接近 2,000,000,000,000,000,000字节


推荐阅读