以编程方式生成 samba 密码哈希

Ale*_*son 1 samba

我想知道是否有一个标准的 Linux/Ubuntu 命令来生成 SMB 密码哈希到stdout. 出于好奇,我想在多台机器上管理一组用户名和密码(使用 Puppet),包括通过 Samba 访问(目前,不使用更通用的东西,如 LDAP)。更具体地说,我用来生成 Linux 密码条目但用于 SMB/Samba 的此命令的等效命令:

openssl passwd -1
Run Code Online (Sandbox Code Playgroud)

use*_*686 7

在内部,Samba 存储与Windows相同的LM 和 NT 哈希值,用于 NTLM 身份验证。

  • NT 哈希使用 MD4 算法,以 UTF-16 Little Endian 编码应用于密码。可以使用普通工具来计算,例如:

    #!/usr/bin/env perl
    use Digest::MD4 qw(md4_hex);
    use Encode qw(encode);
    chomp(my $pw = <STDIN>);
    print md4_hex(encode("UTF-16LE", $pw)), "\n";
    
    Run Code Online (Sandbox Code Playgroud)

    或 OpenSSL:

    printf '%s' "$pw" | iconv -t utf16le | openssl md4
    
    Run Code Online (Sandbox Code Playgroud)
  • LM 哈希可以在几秒钟内破解。没有人再使用它了。不要使用它。现代 Windows 版本以及(希望如此)Samba 只存储“空白”密码的 LM 哈希值,而不管输入如何。

然而,将散列作为脚本的一部分是一个非常糟糕的主意,并不比保留密码本身好多少。如果想要获得原始密码,未加盐的 MD4 哈希很容易破解,即使没有原始密码,哈希也与密码等效——任何拥有哈希的人都可以执行 NTLM 身份验证,而无需密码本身。(Windows 不允许任何人,甚至是管理员,都不能直接访问 SAM,因此最初认为没有必要使用 salt。)