AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 510990
Accepted
StoneThrow
StoneThrow
Asked: 2019-04-07 20:35:56 +0800 CST2019-04-07 20:35:56 +0800 CST 2019-04-07 20:35:56 +0800 CST

为什么每次“openssl passwd”的输出都不一样?

  • 772

openssl passwd 命令计算在运行时键入的密码的哈希值或列表中每个密码的哈希值。密码列表从命名文件中获取选项 -in 文件,从标准输入获取选项 -stdin,否则从命令行获取。UNIX 标准算法 crypt 和基于 MD5 的 BSD 密码算法 1 及其 Apache 变体 apr1 可用。

我理解术语“哈希”的意思是“将输入转换为输出,很难/不可能从中得出原始输入。” 更具体地说,散列后的输入:输出关系为N:M,其中M<=N(即可能发生散列冲突)。

为什么“ openssl passwd”的输出在相同的输入下连续运行?

> openssl passwd
Password:
Verifying - Password:
ZTGgaZkFnC6Pg
> openssl passwd
Password:
Verifying - Password:
wCfi4i2Bnj3FU
> openssl passwd -1 "a"
$1$OKgLCmVl$d02jECa4DXn/oXX0R.MoQ/
> openssl passwd -1 "a"
$1$JhSBpnWc$oiu2qHyr5p.ir0NrseQes1

我一定不明白这个函数的目的,因为它看起来像在相同的输入上运行相同的哈希算法会产生多个唯一的输出。我想我对这种看似 N:M 输入:输出关系(其中 M>N)感到困惑。

linux openssl
  • 3 3 个回答
  • 12395 Views

3 个回答

  • Voted
  1. Best Answer
    telcoM
    2019-04-08T02:17:39+08:002019-04-08T02:17:39+08:00
    > openssl passwd -1 "a"
    $1$OKgLCmVl$d02jECa4DXn/oXX0R.MoQ/
    

    这是扩展的 Unix 风格的crypt(3)密码哈希语法,特别是它的 MD5 版本。

    第一个$1$标识哈希类型,下一部分OKgLCmVl是用于加密密码的盐,然后在分隔$符之后到行尾的是实际的密码哈希。

    因此,如果您从第一次加密中获取盐部分并将其与后续加密一起使用,您应该始终得到相同的结果:

    > openssl passwd -1 -salt "OKgLCmVl" "a"
    $1$OKgLCmVl$d02jECa4DXn/oXX0R.MoQ/
    > openssl passwd -1 -salt "OKgLCmVl" "a"
    $1$OKgLCmVl$d02jECa4DXn/oXX0R.MoQ/
    

    当您更改密码时,您应该始终切换到新的盐。这可以防止任何人事后发现新密码是否与旧密码相同。(如果您想防止重复使用旧密码,您当然可以对新密码候选者进行两次哈希处理:一次使用旧盐,然后,如果结果与旧密码不同,因此可以接受,再次使用新密码盐。)

    如果您不使用openssl passwd任何选项,您将获得原始的crypt(3)- 兼容哈希,如 dave_thompson_085 所述。有了它,盐就是哈希的两个首字母:

    > openssl passwd "a"
    imM.Fa8z1RS.k
    > openssl passwd -salt "im" "a"
    imM.Fa8z1RS.k
    

    您不应该在任何新实现中使用这种旧的哈希样式,因为它将有效密码长度限制为 8 个字符,并且盐含量太少,无法充分防止现代方法。

    (我曾经计算过为每个经典哈希存储一整套彩虹表所需的数据量crypt(3)。我不记得确切的结果,但假设我的计算是正确的,它大约是“一个适度的多堆栈-TB 磁盘”。在我看来,这将其置于“有组织的犯罪分子可以做到”的范围内。)

    • 14
  2. dave_thompson_085
    2019-04-07T21:30:16+08:002019-04-07T21:30:16+08:00

    与普通哈希不同,密码哈希应该使用“salt”并且应该很慢(通常通过迭代)以防止获得哈希的攻击者轻松恢复密码。请参阅security.SX 上的规范和许多与它相关的内容。

    最初的1970 年代 crypt(3),为了清楚起见现在称为 DEScrypt ,是(轻微)加盐的:

    salt是从集合 [a-zA-Z0-9./] 中选择的两个字符的字符串。该字符串用于以 4096 种不同方式之一扰乱算法。

    稍新的 MD5crypt 方案是盐渍和迭代的,但不符合现代标准。https://en.wikipedia.org/wiki/Crypt_%28C%29详细介绍了这些以及在 Unix 上取代它们的一些更好的方案。

    • 5
  3. Freddy
    2019-04-07T21:28:00+08:002019-04-07T21:28:00+08:00

    用户muru是对的。密码是加盐的。

    您可以自己添加选项-salt string,哈希值保持不变。

    $ openssl passwd -salt "foo" "bar"
    foXrpAKGo3142
    $ openssl passwd -salt "foo" "bar"
    foXrpAKGo3142
    
    • 2

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve