我应该在数据库中加密 Google 和 Facebook ID 吗?
Should I encrypt Google and Facebook IDs in the database?
我通过 Google 对用户进行身份验证,Facebook 使用 passsport.js 在我的网络应用程序(MERN 堆栈)中登录,首先我获取用户的 ID,我使用 bcryptjs 对其进行加密并存储它在数据库中。问题是每次用户登录时,我都必须从数据库中获取所有用户,并将每个用户中存储的 ID 与 passport.js 提供的 ID 进行比较。
直接存储ID(不加密)有安全隐患吗?
我当前的代码:
const users = await User.find({ authProvider: 'facebook' });
const user = users.filter(user => bcrypt.compareSync(profile.id, user.authData.id))[0];
我更喜欢这样的东西:
const user = await User.findOne({ 'authData.id': profile.id });
编辑:
也许我应该根据个人资料的电子邮件找到用户,如下所示:
const user = await User.findOne({ authProvider: 'facebook', 'authData.email': profile.emails[0].value });
const isSameID = user ? bcrypt.compareSync(profile.id, user.authData.id) : false;
由于用户 ID 肯定不像密码那样敏感,因此您需要生成一个随机盐 一次 并将其存储在数据库中。然后使用该通用盐来散列您存储的用户 ID,以及散列您正在检查的用户 ID。然后比较是一个简单的二进制比较,数据库可以在这些 blob 上建立索引。
类似于:
const salt = ...; // retrieved from db
const profile_hash = bcrypt.hashSync(profile.id, salt);
const user = await User.findOne({ 'authData.id': profile_hash });
用户ID可以不加密存储,完全不敏感。如果没有他的令牌,你甚至无法获得用户的任何数据。在 Facebook 中,它们甚至是 "App Scoped",因此它们仅对特定 App 有效。您甚至可以在 public 中分享您的用户 ID,这真的没关系。
我通过 Google 对用户进行身份验证,Facebook 使用 passsport.js 在我的网络应用程序(MERN 堆栈)中登录,首先我获取用户的 ID,我使用 bcryptjs 对其进行加密并存储它在数据库中。问题是每次用户登录时,我都必须从数据库中获取所有用户,并将每个用户中存储的 ID 与 passport.js 提供的 ID 进行比较。 直接存储ID(不加密)有安全隐患吗?
我当前的代码:
const users = await User.find({ authProvider: 'facebook' });
const user = users.filter(user => bcrypt.compareSync(profile.id, user.authData.id))[0];
我更喜欢这样的东西:
const user = await User.findOne({ 'authData.id': profile.id });
编辑: 也许我应该根据个人资料的电子邮件找到用户,如下所示:
const user = await User.findOne({ authProvider: 'facebook', 'authData.email': profile.emails[0].value });
const isSameID = user ? bcrypt.compareSync(profile.id, user.authData.id) : false;
由于用户 ID 肯定不像密码那样敏感,因此您需要生成一个随机盐 一次 并将其存储在数据库中。然后使用该通用盐来散列您存储的用户 ID,以及散列您正在检查的用户 ID。然后比较是一个简单的二进制比较,数据库可以在这些 blob 上建立索引。
类似于:
const salt = ...; // retrieved from db
const profile_hash = bcrypt.hashSync(profile.id, salt);
const user = await User.findOne({ 'authData.id': profile_hash });
用户ID可以不加密存储,完全不敏感。如果没有他的令牌,你甚至无法获得用户的任何数据。在 Facebook 中,它们甚至是 "App Scoped",因此它们仅对特定 App 有效。您甚至可以在 public 中分享您的用户 ID,这真的没关系。