PasswordHash的比较是在客户端级别还是在数据库级别进行的?

安德鲁·麦克

我需要澄清一些有关用户身份验证的内容,因为我想知道其正确执行的方式,

有人告诉我,身份验证是一个涉及安全性的过程。因此,身份验证过程应尽可能不向客户端隐藏,并且客户端应仅接收标志值(1 =密码正确且已认证,-1 =错误密码)和/或已认证用户的用户名。因此,它应该是应该在后端执行的SQL操作。因此,详细的过程应该是:客户端表单将用户名和哈希/加密的密码发送给SQL,SQL进行身份验证,并将带有用户名的1 / -1发送给客户端作为返回值和输出。

但是,当我通过用户身份验证进行在线搜索时,情况并非如此,我在网络上看到的所有线程(应用程序是Windows还是Web)都由开发人员执行两项操作:

  1. 在SQL Server中,按用户名搜索密码的saltHash值,然后将saltHash值与PasswordHash一起返回到客户端表单/或业务层

  2. 在客户端或BLL中,使用输入的密码和返回的saltHash值生成一个PasswordHash,然后将此passwordHash与返回的passwordHash进行比较。如果匹配的密码是正确的,如果不是密码是错误的。

这实际上是开发人员如何编写代码来在登录事件中对用户进行身份验证吗?如果基本上是这样,密码比较发生在客户端(无论是在表单还是在业务层),那么通过将实际的saltHash和passwordHash暴露给客户端,这不会带来巨大的安全风险吗?

如果有人可以给我写一些代码来演示SQL和C#的登录/身份验证过程,那就太好了!

PS-当您回复时,请不要使用LINQ,LINQ to SQL或实体框架。此刻我不认识他们。还在学习。请从Ado .NET答复

谢谢

厄玛·伊克巴尔

这是一个更大的利弊讨论,很难一概而论。客户端哈希的优点:

  • 由于加密安全的哈希在计算上是密集型的,因此通过将其推送到客户端,可以减少来自服务器的负载。
  • 服务器永远看不到实际的密码,并且由于用户在站点之间共享密码,因此如果您的系统受到破坏,则可以声明密码没有泄漏。

服务器端哈希的优点:

  • 请勿为多个客户端(即Windows Phone,Android和IOS等各种移动设备以及浏览器)编写用于计算哈希的代码。有时,在兼容性方面存在差异时,也需要为浏览器编写专门的代码。
  • 散列可以更“安全”,例如,您可以为每个用户使用随机盐,这使得在数据库遭到破坏时,如果有人用蛮力攻击密码,在计算上会非常昂贵。这样,您可以有更多时间通知用户是否发生违规行为,并让用户更改密码。

其他一些准则:

  • 切勿在数据库中存储密码(无论是加密密码还是纯文本密码)。您不能保证可以访问数据库的每个人都不会查看密码,被黑或犯错误,并且不会破坏密码。
  • 此类流量必须始终通过TLS或SSL进行传输,这将防止许多攻击(例如窃听,MITM,重播等)。
  • 对于所有加密操作,请始终使用加密功能(例如SHA2用于哈希,PBKDF2用于导出盐等)。

以下是有关在客户端和服务器方案中如何进行密码哈希处理的一些准则。

如果服务器上有哈希:

  • 用户首次注册时:
    • 产生随机盐
    • 用这个盐散列密码
    • 将盐和密码哈希存储在数据库中
  • 用户登录时
    • 从数据库中读取盐
    • 计算密码哈希
    • 与数据库中的比较

如果哈希在客户端上:

  • 用户首次注册时:
    • 根据客户端上的某些用户属性(例如用户名)生成盐
    • 在客户端上使用盐散列密码
    • 将密码哈希发送到服务器,并存储数据库
  • 用户登录时
    • 根据相同的用户属性生成盐(例如,您始终可以使用用户名)
    • 在客户端上使用盐散列密码
    • 将密码哈希发送到服务器,与数据库中的密码哈希进行比较

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我应该在数据库端还是在客户端捕获异常?

来自分类Dev

Rails-我应该在模型级别还是在数据库级别定义默认属性值?

来自分类Dev

Rails-我应该在模型级别还是在数据库级别定义默认属性值?

来自分类Dev

Slick 3.0在数据库驱动程序级别上是被动的还是异步的?对于哪些数据库?

来自分类Dev

数据库客户端抽象

来自分类Dev

将客户端IP存储在数据库中

来自分类Dev

字节图像未从客户端浏览器保存在数据库中

来自分类Dev

在数据库级别限制关联记录的数量

来自分类Dev

在数据库级别限制关联记录的数量

来自分类Dev

在数据库级别或应用程序级别过滤数据

来自分类Dev

是否在数据库级别或服务器/实例级别启用了“ CLR集成”?

来自分类Dev

是否可以在数据库级别设置无锁或事务隔离级别未提交读?

来自分类Dev

数据库兼容级别

来自分类Dev

TIB数据库更改客户端库

来自分类Dev

我的SQL版本是由我正在访问的数据库还是由SQL客户端确定的?

来自分类Dev

如何在没有风险的情况下将ip(客户端)存储在数据库中

来自分类Dev

客户端数据库的工厂和指令

来自分类Dev

数据库客户端设计以支持不同的后端

来自分类Dev

以蛋糕模式抽象数据库客户端

来自分类Dev

Laravel API连接到客户端数据库

来自分类Dev

客户端可访问的noSql数据库?

来自分类Dev

发送数据库查询结果给客户端

来自分类Dev

使用PHP访问客户端的SQL数据库

来自分类Dev

MFC Dekstop客户端的数据库选择

来自分类Dev

Jersey REST客户端未创建数据库

来自分类Dev

客户端可移植数据库,用什么?

来自分类Dev

从数据库服务器端创建绘图并在客户端对其进行可视化

来自分类Dev

使用数据库客户端连接到4D数据库

来自分类Dev

在允许访问Internet之前,使用自定义数据库对WiFi客户端进行身份验证

Related 相关文章

  1. 1

    我应该在数据库端还是在客户端捕获异常?

  2. 2

    Rails-我应该在模型级别还是在数据库级别定义默认属性值?

  3. 3

    Rails-我应该在模型级别还是在数据库级别定义默认属性值?

  4. 4

    Slick 3.0在数据库驱动程序级别上是被动的还是异步的?对于哪些数据库?

  5. 5

    数据库客户端抽象

  6. 6

    将客户端IP存储在数据库中

  7. 7

    字节图像未从客户端浏览器保存在数据库中

  8. 8

    在数据库级别限制关联记录的数量

  9. 9

    在数据库级别限制关联记录的数量

  10. 10

    在数据库级别或应用程序级别过滤数据

  11. 11

    是否在数据库级别或服务器/实例级别启用了“ CLR集成”?

  12. 12

    是否可以在数据库级别设置无锁或事务隔离级别未提交读?

  13. 13

    数据库兼容级别

  14. 14

    TIB数据库更改客户端库

  15. 15

    我的SQL版本是由我正在访问的数据库还是由SQL客户端确定的?

  16. 16

    如何在没有风险的情况下将ip(客户端)存储在数据库中

  17. 17

    客户端数据库的工厂和指令

  18. 18

    数据库客户端设计以支持不同的后端

  19. 19

    以蛋糕模式抽象数据库客户端

  20. 20

    Laravel API连接到客户端数据库

  21. 21

    客户端可访问的noSql数据库?

  22. 22

    发送数据库查询结果给客户端

  23. 23

    使用PHP访问客户端的SQL数据库

  24. 24

    MFC Dekstop客户端的数据库选择

  25. 25

    Jersey REST客户端未创建数据库

  26. 26

    客户端可移植数据库,用什么?

  27. 27

    从数据库服务器端创建绘图并在客户端对其进行可视化

  28. 28

    使用数据库客户端连接到4D数据库

  29. 29

    在允许访问Internet之前,使用自定义数据库对WiFi客户端进行身份验证

热门标签

归档