【问题标题】:Hashing/encrypting a string that involves special characters?散列/加密涉及特殊字符的字符串?
【发布时间】:2022-01-24 18:30:51
【问题描述】:

我正在寻找一种散列算法或加密方法(我不想使用单独的密钥)将字符串转换为字母、数字和特殊字符的“随机”混乱。

我正在尝试创建一个无状态密码“manager”,其中将域和主密码组合转换为(当前)一个 SHA256 字符串,我现在正尝试将其转换为包含特殊字符的字符串,因为有些网站有这个要求。

【问题讨论】:

  • 散列和加密算法不输出字符串——它们对字节进行操作,它们的输出也是字节。当它们需要以人类可读的形式显示时,这些字节通常会转换为十六进制字符串表示,但这不是唯一的方法。你可以对这些字节做任何你想做的事情,将它们转换成 ASCII 或 Unicode 字符的其他子集。
  • 嗯,目前我刚刚对字符串进行了哈希处理(使用 Rust 的 SHA2 crate,所以我得到 6891d8d8570b5b4 等等,我不知道有什么方法可以打印那些涉及特殊字符的字节,也许我将不得不挖掘更多
  • 如果您查看这些 crate 中组件使用的方法,您会发现它们仅使用字节,并且您的代码没有直接传递字符串或接收字符串输出。例如,您可能用来生成散列的update() 方法需要一个字节数组([u8])。 finalize() 方法也返回一个字节数组。
  • 谢谢,我会使用这些信息。 :)
  • 这种“密码管理”风格似乎是个坏主意。您不会找到一种方法来生成满足每个网站任意规则的密码,因为这些规则很可能直接相互矛盾(例如,一些网站需要特殊字符,而另一些则不允许)。此外,您无法仅更改一个站点的密码,这在安全漏洞后是必需的。

标签: encryption rust passwords


【解决方案1】:

有几种简单的方法可以将随机的 256 位字符串转换为一组可打印的 ASCII 字符。

一个是 Base64。最后可能会出现一些+/ 字符,最后加上=。还有 Base64URL 编码,类似,但字符不同。另一个是Ascii85,您可以使用或不使用<~~> 分隔符。

但是,作为很久以前创建类似密码管理器的人,我可以告诉您,问题总是在于各种网站都有非常糟糕的密码策略。例如,某些网站将您限制为 16 个字符(这些字符串会更长),或者它们限制可用的特殊字符(因此不允许您在字符串中包含的字符),或各种其他情况。还有一些环境,例如一些公司环境,人们必须使用很长的密码(例如,超过 64 个字符)来强制人们使用密码管理器。

因此,如果您想让它起作用,您需要在这里做两件事:

  • 在您的哈希信息中包含所需的密码长度(以字节为单位)和您正在使用的编码算法(您可能需要支持多个)。
  • 有一些方法可以创建任意长度的字符串,这可能是使用您在 HKDF 中的秘密来提取任意数量的字节。

所有这些都意味着您需要存储一些状态。但是,由于从没有随机盐的普通密码中获取秘密无论如何都是不安全的,因此如果您不希望您的设计存在安全漏洞,则首先需要这样做。

【讨论】:

  • 对。我想这意味着我必须找到多种显示字节的方法。
猜你喜欢
  • 2012-12-21
  • 2016-04-22
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
相关资源
最近更新 更多