Py学习  »  MongoDB

我应该加密MongoDB中的用户名/电子邮件字段吗?

orangeMint • 4 年前 • 506 次点击  

所以我正在加密数据库中的字段,但我认为我不能加密用户的 username email 因为我使用这些字段来查找用户。我可以对它们进行散列,但是由于我不认为我可以对每个用户名/电子邮件使用唯一的salt,所以有些人可以使用rainbow表来查找隐藏的用户名/电子邮件。

我想不用加密就可以了?我想使网站尽可能安全。散列它们有意义吗?我可以通过他们的 _id 而不是 用户名 / 电子邮件 ,但我不会让他们 _身份证 直到我找到用户。

我目前正在做的是:

const user = await new db.userModel({
    email: email,
    username: username,
    stuff: cryptr.encrypt(stuff),
});

////

const user = await db.userModel.findOne({
    email: email
}).exec();

编辑:我想散列是没有意义的,因为我不能取消散列用户名/电子邮件。不知道我在想什么。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/51948
 
506 次点击  
文章 [ 2 ]  |  最新文章 4 年前
veprolet
Reply   •   1 楼
veprolet    4 年前

这个问题真的应该在infosec Stackexchange上提出。

加密通常是毫无意义的,因为您需要访问密钥才能使用加密的数据库。这意味着您需要将它保存在数据库旁边。如果你的服务器受到攻击,黑客就会用密钥解密数据库。当然,这比什么都不做要好,因为黑客可能(也许不太可能)只会危害数据库。Horatiu Jeflea hovewer提到了加密数据库的其他重要原因,如果您不是单独在项目中工作,则应该特别考虑这些原因。

只有在不需要显示用户名的情况下,散列用户名才是可能的,但是用户名通常是公共的,所以它对安全性的提高很小。

散列电子邮件是一个有趣的问题。你问他们是有原因的。您可能需要联系您的用户。如果你把它们杂凑起来,你就做不到,如果你不需要这样做,那么你不需要(也不应该)首先保存它们。但是,如果它们只是身份验证过程的一部分,那么这将是可能的解决方案。

彩虹表不能真正打破现代哈希算法,尽管最大的缓解是前面提到的salt,这将使它 很多 对大多数散列攻击来说更难。您还必须确保您使用的不是像md5这样易受攻击的,而是像sha256这样安全的或足够的bcrypt。你应该用其中一个来散列密码。还要注意的是,您可以对所有散列字段使用相同的salt,salt甚至可以是(这会减少一点安全性)一个公共字段(username?)不用盐的理由很少。

总而言之:你不能散列它们,加密可能不值得,除非你能充分地隔离密钥,或者因为外部黑客以外的原因而需要它

Horatiu Jeflea
Reply   •   2 楼
Horatiu Jeflea    4 年前

我想不用加密就可以了?

在大多数情况下,是的。密码应该是散列的(+salt..),敏感数据应该是加密的。但用户名或电子邮件在大多数情况下不应敏感。


但假设它们将在数据库中加密。

你在储存 encrypt(username) 在你的数据库中,所以为了搜索它,而不是使用 username ,使用 加密(用户名) . 当然,排序可能会引起一些麻烦,但找到用户应该是高效的。


想想加密(在你的例子中)不是关于黑客,而是关于那些正在阅读这些记录的人。例如,正在调查生产问题或DBA的开发人员,需要一些(并非所有)字段难以读取。将密钥存储在另一台机器上(最好是在密钥管理工具中)将添加额外的安全层。