Java中的多重加密技术

Java中的多重加密技术,java,encryption,password-encryption,Java,Encryption,Password Encryption,使用其他算法加密已加密的数据是否安全 例如,我使用“PBKDF2WithHmacSHA1”对密码进行了加密 现在我想使用“SHA512”对其进行进一步加密(因为它被认为比“SHA1”更好) 这会削弱我的加密吗 此外,我是否应该反转加密密码以提高安全性 即使“PBKDF2WithHmacSHA1”足够了,我还是希望有额外的保护层。这就是为什么我一直在考虑多重加密。但是,我目前不打算使用第三方选项,如BouncyCastle 如果您是特定于Java的,这将很有帮助 谢谢大家! 有几件事 1:“使用其

使用其他算法加密已加密的数据是否安全

例如,我使用“PBKDF2WithHmacSHA1”对密码进行了加密

现在我想使用“SHA512”对其进行进一步加密(因为它被认为比“SHA1”更好)

这会削弱我的加密吗

此外,我是否应该反转加密密码以提高安全性

即使“PBKDF2WithHmacSHA1”足够了,我还是希望有额外的保护层。这就是为什么我一直在考虑多重加密。但是,我目前不打算使用第三方选项,如BouncyCastle

如果您是特定于Java的,这将很有帮助

谢谢大家!

有几件事

1:“使用其他算法加密已加密的数据是否安全”

回答:是。它需要两种算法来解密,可能攻击者都不知道这两种算法(或者以什么顺序等),因此它是安全的。它不会损坏您的数据

2:“我使用“PBKDF2WithHmacSHA1”对密码进行了加密。”

评论:错误。你没有加密任何东西。你所做的就是对你的密码进行哈希运算。关键区别在于散列是任意长度数据段的固定长度表示。这意味着“hello”的散列将与“This is a longer phrase”的长度(但内容不同)完全相同(这假设您对这两个短语使用相同的算法,实际上是这样)。假设哈希算法设计正确,应该不可能进行反向工程并将原始数据取回。另一方面,加密接收任意长度的数据,并输出类似长度的“随机”数据通过加密,您可以取回原始数据

所以,要明确的是,您是在散列,而不是加密。这将是一个重要的区别

3:现在我想使用“SHA512”进一步加密它(因为它被认为比“SHA1”更好),这会削弱我的加密吗

回答:如前所述,您正在散列,而不是加密密码。这意味着一旦PBKDF2WithHmacSHA1算法完成,您将拥有一个包含2^160个可能组合的字符串(源:)。这意味着您已经创建了一组有限的(尽管承认很大)可能值,然后可以使用HMACSHA512或简单SHA512(以两者为准)将其输入PBKDF2

这是最重要的部分。请记住,哈希提供了一个代表数据的字符串。由于您已经生成了一个结果空间为2^160个可能条目的散列,通过更强大的散列算法运行该散列不会显著提高安全性

4:“我目前不打算使用BouncyCastle等第三方选项。”

评论:我不太清楚你的意思,但我会给你一个警告。加密的最大规则之一是:不要自己做。不要编写自己的算法。甚至不要自己编写标准算法的实现(例如,作为学术练习或其他活动除外)。相反,使用一个已知设计和功能正确的库(JAVA附带的库或第三方库)

5:其他一切:额外的保护层是一件好事。撤销密码就是你可以做的一件事;另一种流行(且广泛使用)的方法是引入盐。这只是您在函数中使用的单词或短语(通常存储为纯文本)。例如,如果对“hello”进行散列,可以使用诸如“helloSALT”、“ShelloALT”、“helSAloLT”等salt。只需将额外数据引入预散列数据中,即可使其更加复杂。理想情况下,只有您的程序才能知道盐是如何被使用的,因此破解密码将困难得多编辑:正如英仙座在下面指出的,每个密码的SALT是不同的。您还可以引入胡椒粉(是的,盐和胡椒粉),这基本上是相同的,只是胡椒粉在整个程序中是恒定的

然而

现在计算机的速度有多快,最大的问题是计算时间。具体来说,它有多小。SHA1,甚至SHA512散列可以非常快速地生成,这使得计算机每秒可以生成数百万个散列,从而可以成功地强制输入密码(这是一件坏事)。所以,理想情况下,你想要的是一个需要“长”时间才能生成的算法(我说的“长”是指可能1-10毫秒……按照人类的标准,仍然非常快,但按照计算机的标准,速度非常慢)。例如,如果你的散列需要10毫秒才能生成,你每秒只能计算100个,而不是数百万个

输入BCrypt。与SHA512一样,这是一种哈希算法。(这也是文件加密实用程序的名称,请不要混淆两者)。BCrypt是一种自适应算法。它的设计目的是,随着计算机功能的增强,您可以使哈希变得更加复杂。我不想详细介绍,只想将您重定向到这个在线bcrypt生成器:


作为参考,选择了4次迭代后,哈希几乎立即生成,但选择了12次迭代后,哈希需要大约2整秒的时间生成—生成单个密码的时间非常长。该演示只支持12个,但bcrypt支持31个。(这个数字是根据网站而定的,这个数字可能是任意的,也可能意味着其他一些东西。关键是,使用bcrypt,您可以将其配置为需要更长的时间来生成哈希-攻击者不仅需要更多的时间来生成哈希,还需要知道要针对多少次重复…这是另一个安全层。))

非常感谢!我真的很感激你详细的回答。这有助于澄清我对数据保护的一些概念