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

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

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

openssl passwd -1

答案1

在内部,Samba 存储相同的LM 和 NT 哈希与 Windows 一样,用于 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";
    

    或 OpenSSL:

    printf '%s' "$pw" | iconv -t utf16le | openssl md4
    
  • LM 哈希可以在几秒钟内被破解。现在没人使用它了。不要使用它。现代 Windows 版本以及(希望如此)Samba 只存储“空白”密码的 LM 哈希,无论输入什么。

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

相关内容