哈希和加密相结合:保护安全

Posted

技术标签:

【中文标题】哈希和加密相结合:保护安全【英文标题】:Hash and encryption in combination: Preserve security 【发布时间】:2011-12-17 22:16:23 【问题描述】:

我想用主密钥或主密码保护我的机密信息数据库并加密数据。只有用户输入正确的主密钥,数据才会被解密。

显然,在创建主密钥时,我应该只将其保存为哈希值(例如 SHA)。但是我还需要一个密钥来加密数据(例如 AES)。我想到了使用主密钥的哈希值作为加密密钥。

但可能,这并不安全,对吧?

如果用户输入一个键,则计算哈希值并将其与保存的哈希值进行比较。如果它们相同,则应该对数据库进行加密。

但是保存主密钥的哈希值并将其用作加密密钥可能存在安全风险,对吧?

我是否应该使用主密钥的实际(明文)版本来加密数据?

或者只是省略将哈希值与输入的密码进行比较的步骤,而只是尝试使用输入的密码加密数据?

我希望你能理解我想告诉你的关于我的问题的内容。提前非常感谢!

【问题讨论】:

为什么不用密码保护数据库访问?为什么还要加密数据? 也许是为了防止诸如 SQL 注入之类的攻击或任何其他只能访问数据库中数据的攻击? @Hanno:通过加密数据来防止 SQL 注入?对我来说似乎太多了。更不用说如果 SQL 注入是可能的,数据可能会被破坏,加密也无济于事 是的,SQL 注入等可以破坏数据库中的很多东西。 - 或者,比方说,您的数据库上个月的一个备份磁带通过不受信任的人走了一些奇怪的弯路……软件访问保护在这里不再有帮助。 哦,但是:对于密码,加密真的只是第二好的方法。如果您可以使用加盐和散列的密码,就这样做吧! 【参考方案1】:

最好清楚地划分职责,只将一个加密实体用于一个目的而不是其他任何东西。

对于对称加密(例如 AES),您需要一个密钥,而这样的密钥通常源自密码(但它可以源自许多其他事物,例如文件,甚至直接输入)。所以这个实体是“密码-成为-加密-密钥”。为此目的使用它。无需将密码存储在任何地方,因为您只需要从中获取正确的密钥。

如果您还想使用具有身份验证和授权的帐户系统来保护对您的应用程序或数据库的访问,您还需要管理这些凭据。那是完全不相关的活动;查找标准解决方案的任何基本 Web 应用程序设计指南。

只是不要重复使用登录密码作为加密密钥。

【讨论】:

谢谢,您正确理解了我的问题 :) 假设我们有一个密码数据库(例如“PasswordSafe”)。用户输入存储在数据库中的密码。为防止未经授权的用户访问数据,我们使用用户输入的“主密钥”加密文件(例如 AES)。正确的?但是如果用户以后想再次查看该列表,我们必须检查他是否输入了正确的密码,对吗?所以我应该保存“主密钥”的哈希值,以检查它是否正确,如果是,则使用输入的密码解密数据。你明白吗? 我认为您不需要任何额外的“检查”。您可以在列表前加上可识别的标识符(如"Works!"),当用户输入密码(或任何其他合适的密钥派生词)时,您只需检查前六个字节是否解密为魔术字符串。我在您的设计中没有看到独立的身份验证方案,也不会添加任何真正的安全性。 (我所描述的本质上是 TrueCrypt 是如何做到的——你可以从密钥材料中判断你是否得到了正确的密钥,就这么简单。) 散列通常用于密钥生成:对称密码需要密钥,用户输入密码;因此哈希函数应用于密码(和相关材料)以创建密钥。基本上我上面已经说过了。 @MarcoW.:确实,密钥需要是固定长度的;密码没有。此外,更实际地,键入的密码只会覆盖非常小的可能字节值范围,这将极大地削弱可能键的搜索空间! @MarcoW.:这就是密码的工作原理。如果你有兴趣,可以阅读算法的详细信息。

以上是关于哈希和加密相结合:保护安全的主要内容,如果未能解决你的问题,请参考以下文章

AES与RSA相结合数据加密方案

红线科技强势来袭,数据安全加密保护解决方案

Java结合keytool实现非对称加密和解密

Django:在模型选择中将惰性翻译与标记安全相结合

Apache网页与安全优化——防盗链和隐藏版本(理论实践相结合!)

非对称加密