当前位置: 首页 > 面试题库 >

存储用户并传递单个表或单独的表

和光启
2023-03-14
问题内容

我想为我的网站创建一个用户管理系统,

有什么更好的安全性和性能。

类型1:

table_user : user_id , user_name , user_email , user_password . user_phone ...

或者

类型2:

table_user : user_id , user_name , user_email ...
table_pass : user_id , user_password .
table_phone: user_id , user_phone .

哪一个更好 ?


问题答案:

理想情况下:

  • 根本不存储密码(即使是加密的)。存储从密码派生的 哈希
  • 给密码加盐以防止彩虹攻击。
  • 将散列放在单独的数据库服务器上,位于其自己的防火墙和其定义良好的API 1之后。该API应该只做三件事:
    1. 对于给定的用户名,检索相应的密码哈希。
    2. 对于给定的用户名,设置新的哈希(以支持重置密码)。
    3. 删除给定的用户名及其哈希(以支持用户注销)。
  • 对盐执行相同的操作:将它们放在自己的服务器上,并放在自己的防火墙和API之后。该API应该只做三件事:
    1. 对于给定的用户名,检索相应的盐。
    2. 对于给定的用户名,将新盐设置为随机值(以支持重置密码)。
    3. 删除给定的用户名及其盐(以支持用户注销)。
  • 哈希服务器和Salt服务器都应该与世界隔离(并且彼此隔离),并且只能从运行Web应用程序的服务器(即PHP或ASP.NET或其他任何服务器)访问。

当用户尝试通过输入用户名和密码登录时:

  • 确保通过HTTPS完成此操作,以使输入的数据安全地到达您的服务器。
  • 调用用于检索用户名密码哈希的API。
  • 调用用于检索用户名盐的API。
  • 盐化并哈希用户输入的密码,并将其与检索到的哈希进行比较。
  • 如果它们匹配,则授予用户访问权限。

从本质上讲,哈希是不可逆的-
除了用户以外,没有人(甚至没有您)知道确切的密码。万一用户忘记了密码,您不能将密码发送给他们,但是您可以允许他们重设密码,前提是他们通过了一些其他验证(例如,可以访问特定的电子邮件地址和/或回答机密信息)问题)。

顺便说一句,登录是一个 相对 罕见的操作,因此除非您完全忽略正确的索引编制,否则不太可能造成性能瓶颈。

1 例如,实施一个Web服务,然后仅打开该Web服务所需的端口,然后再打开其他端口。



 类似资料:
  • 7.3.2 约定存储单元传递参数 在调用子程序时,当需要向子程序传递大量数据时,因受到寄存器容量的限制,就不能采用寄存器传递参数的方式,而要改用约定存储单元的传送方式。这种参数传递方式有点象情报人员和联络人员之间的传递信息方式,一个向指定地点放情报,另一个从指定地点取情报。 例7.2是采用约定存储单元传递参数的例子,所处理的数据不是直接传给子程序,而是把存储它们的地址告诉子程序。 例7.4:编写一

  • 问题内容: 我的问题是我在列表中有值。我想将这些值分开并作为单独的参数发送。 我的代码是: 这行代码 不起作用,但是我想知道是否可以调用一些内置函数来将值从列表中分离出来,因此以后我们可以将它们作为两个不同的参数发送。与相似,但是要动态完成,因此我不必显式键入列表参数。 问题答案: 调用函数时,可以使用 args(参数)和* kwargs(用于关键字参数)。看一下这个博客,了解如何正确使用它。

  • 我在https://symfony.com/doc/current/security/form_login_setup.html遵循教程,我想访问用户名。我想让会话存储用户名,但是我不知道如何捕获登录用户的用户名。 到目前为止,我已经尝试了

  • 我想知道是否有可能将不同流中的数据合并成一个流。通过合并,我的意思是将其添加到单独的列中,而不是添加到现有的列中。 到目前为止,我已经能够将数据收集到单独的地图中,如下面的示例所示。我认为我应该把这些地图合并成一张,但不确定如何去做,或者我是否做错了什么。 我做了一些搜索,在FlatMap、Concat等网站上找到了一些线索,但因为我对这条流还不熟悉 例如:列出数据-1

  • 我在下面尝试将一个参数发送到单独的功能文件(通过下面的示例),但它没有按预期工作。 project.feature 删除项目。特色 低于异常 通用域名格式。凭直觉。空手道。例外KarateException:项目。功能:48-删除_项目。功能:11-状态代码为:404,预期为:200,响应时间:239,url:https://localhost:8080/project/#(id)响应:{“状态”

  • 问题内容: 如何将参数传递给表单? 根据以下答案进行编辑: 问题答案: 你应该定义表单的方法,如下所示: 没有意义。创建表单后,必须将属性添加到窗口小部件。尝试这样的事情: