Security 哈希和加密的组合:保护安全性

Security 哈希和加密的组合:保护安全性,security,encryption,hash,Security,Encryption,Hash,我想用主密钥或主密码保护我的机密信息数据库,并对数据进行加密。只有用户输入正确的主密钥,数据才会被解密 显然,在创建主密钥时,我应该只将其保存为散列值(例如SHA)。但是我还需要一个密钥来加密数据(例如AES)。我考虑使用主密钥的散列值作为加密密钥 但这可能不安全,对吧 如果用户输入密钥,将计算哈希值并与保存的哈希值进行比较。如果它们相同,则应加密数据库 但是保存主密钥的散列值并将其用作加密密钥可能存在安全风险,对吗 我应该使用主密钥的实际(明文)版本来加密数据吗 或者只是省去将散列值与输入的密

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

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

但这可能不安全,对吧

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

但是保存主密钥的散列值并将其用作加密密钥可能存在安全风险,对吗

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

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


我希望你能理解我想告诉你的关于我的问题。提前多谢

最好将责任明确地分开,只为一个目的使用一个加密实体,而不为其他目的使用

对于对称加密(例如AES),您需要一个密钥,而这样的密钥通常是从密码中派生出来的(但它可以从很多其他东西中派生出来,比如文件集合,甚至直接输入)。所以这个实体就是“密码,密码变成了加密密钥”。为此目的使用它。无需将密码存储在任何地方,因为从中获取正确的密钥就是您所需要的

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


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

最好将责任明确地分开,只使用一个加密实体用于一个目的,而不使用其他目的

对于对称加密(例如AES),您需要一个密钥,而这样的密钥通常是从密码中派生出来的(但它可以从很多其他东西中派生出来,比如文件集合,甚至直接输入)。所以这个实体就是“密码,密码变成了加密密钥”。为此目的使用它。无需将密码存储在任何地方,因为从中获取正确的密钥就是您所需要的

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



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

为什么不使用密码保护数据库访问?为什么还要加密数据?可能是为了防止SQL注入或任何其他仅能访问数据库中数据的攻击?@Hanno:通过加密数据来防止SQL注入?似乎是这样对我来说太多了。更不用说如果SQL注入是可能的,那么数据可能会被破坏,加密也无济于事。是的,SQL注入之类的东西会破坏数据库中的很多东西。-或者,比方说,上个月的一盘数据库备份磁带通过不受信任的人绕道而行。。。软件访问保护在这里不再有用了。哦,但是:对于密码,加密实际上只是第二个最好的方法。如果你可以使用盐渍和哈希密码,那就去做吧!为什么不用密码保护数据库访问?为什么还要加密数据?也许是为了防止像SQL注入或任何其他只访问数据库中数据的攻击?@Hanno:通过加密数据来防止SQL注入?对我来说似乎太多了。更不用说SQL注入是否可行了数据可能会被破坏,加密也无济于事。是的,SQL注入等可以破坏数据库中的很多东西或者,比方说,上个月的一盘数据库备份磁带通过不受信任的人绕道而行。。。软件访问保护在这里不再有用了。哦,但是:对于密码,加密实际上只是第二个最好的方法。如果你可以使用盐渍和哈希密码,那就去做吧!谢谢,您正确理解了我的问题:)假设我们有一个密码数据库(如“PasswordSafe”)。用户输入存储在数据库中的密码。为了防止未经授权的用户访问数据,我们使用用户输入的“主密钥”对文件(如AES)进行加密。对吗?但是如果用户想稍后再次查看列表,我们必须检查他输入的密码是否正确,对吗?所以我应该保存一个“主密钥”的散列,以检查它是否正确,然后,如果正确,用输入的密码解密数据。你明白吗?我想你不需要额外的“检查”。您只需在列表前添加一个可识别的标识符(如
“Works!”
),当用户输入密码(或任何其他合适的密钥派生程序)时,您只需检查前六个字节是否解密为魔术字符串。我在您的设计中没有看到独立的身份验证方案,也不会添加任何真正的安全性。(我描述的基本上是TrueCrypt是如何做到的——你可以从密钥材料中判断你是否得到了正确的密钥,就这么简单。)散列通常用于密钥生成:对称密码需要密钥,用户输入密码;因此,对密码(和相关材料)应用哈希函数来创建密钥。基本上是我上面已经说过的。@MarcoW:的确,钥匙需要有固定的长度;密码不存在。此外,更实际地说,键入的密码只覆盖很小范围的可能字节值