当前位置: 首页 > 知识库问答 >
问题:

如何在网络上散列和加密密码?

陈马鲁
2023-03-14

我正在处理一个pet项目,现在我想添加用户注册支持。经过一些研究,我决定在数据库中保存哈希密码和salt,而不是原始密码。然而,我不知道这些步骤是什么,顺序是什么。以下是我的假设:

注册

  1. 客户端向服务器发送用户名和密码(https)
  2. 服务器获取密码,生成随机salt
  3. Base64对盐进行编码
  4. 用stringify salt散列密码
  5. Base64对密码进行编码
  6. 将密码和salt保存到数据库中

登录

  1. 客户端向服务器发送用户名和密码(https)

我正在按照我的设想实施我的系统,一切似乎都在运行。但是,我不确定base64编码部分。将密码和salt从二进制编码为字符串的目的是什么,我可以跳过这一步吗?如果我假设的过程是错误的,那么正确的步骤是什么?

另外,我用的是快车。js作为服务器,mysql作为数据库

共有2个答案

东明德
2023-03-14

你需要理解盐的含义。这是一种使用彩虹表对可能的暴力攻击设置障碍的方法。这意味着一些坏人会用高计算能力尝试所有可能生成的哈希。然后尝试从这样的散列中提取纯文本
因此,salt的存在是为了确保即使受到这种攻击,返回的纯文本也不是正确的。

例如:用户名:"Xavier_Ex"密码:"Ilovestackoverflow"

该密码将散列为“sfhj87s

但当盐腌制时,它会像“Ilovestackoverflow”-

使用彩虹表,“dfgdfgdf”将返回“Io*VES5 TACMKOVE3RFLOW”。。你的密码仍然是秘密的。

简言之除非您确实需要此类保护,否则您可以跳过此操作。

颛孙哲
2023-03-14

总的想法是可以的,但我有一些意见:

  • 而不是使用散列,您应该使用PBKDF,一个基于密码的密钥派生函数。最好使用标准化版本,即PBKDF2。与盐一起,您还应该选择一些迭代来阻止攻击。
  • 确保用户名和密码始终使用相同的字符编码。
  • 密码算法应该基于二进制输入和输出。
  • 当您存储或加载二进制数据到文本演示文稿时,您应该分别使用Base 64编码/解码。

因此,该计划包含以下问题:

  • 使用散列代替PBKDF。
  • 使用64编码的盐作为散列的输入。
 类似资料:
  • 我正在使用以下代码创建哈希密码和salt: 我正在数据库中存储HashedPassword和Salt。 现在我要验证用户登录时的密码: 这不起作用,我得到了一个完全不同的哈希密码,而不是存储在数据库中的密码。据我所知,您应该在用户登录时输入的密码之前预置salt,然后运行相同的哈希密码函数。上面不是等价于那个吗?

  • 问题内容: 我需要对密码进行哈希处理以存储在数据库中。如何用Java做到这一点? 我希望使用纯文本密码,添加随机盐,然后将盐和哈希密码存储在数据库中。 然后,当用户想要登录时,我可以使用其提交的密码,从其帐户信息中添加随机盐,对其进行哈希处理,然后查看其是否等同于其帐户信息所存储的哈希密码。 问题答案: 实际上,你可以使用Java运行时内置的工具来执行此操作。Java 6中的SunJCE支持PBK

  • 我有一个简单的密码加密程序,当用户注册时,它会给我一个散列/盐析密码,以存储在我的数据库中。代码: 当用户登录时,我想我不能简单地通过此代码将输入的密码放回并进行比较,因为这会给我一个不同的结果。如何简单地将存储的密码与输入的登录密码进行比较?

  • 我正在为拉拉维尔创建一个散列密码。现在有人告诉我使用Laravel哈希助手,但我似乎找不到它,或者我找错了方向。 如何创建laravel散列密码?在哪呢? 编辑:我知道代码是什么,但我不知道在哪里和如何使用它,所以它返回给我散列密码。如果得到散列密码,就可以手动将其插入数据库

  • 这些散列密码的方法中,哪一种最安全,最难发现散列冲突? 仅MD5 仅SHA1 通过SHA1MD5

  • 我试图完全理解密码散列,以便能够向审计员解释它。 基于我对答案的搜索,我知道函数是的包装器。在阅读预定义常量的PHP手册时,我看到它使用作为默认整数值(基本上它使用算法来散列密码)。 让我困惑的是,变量如果省略,会生成一个随机salt,并且成本将设置为。如果我提供了更高的成本(例如:),由于我没有提供salt值,它还会生成随机salt吗?我在这里感到困惑的原因是,我没有忽略,而是提供了不同的成本。