smb 身份验证(74 字节与 24 字节?

2022-09-01 21:27:49

我需要实现一个虚拟文件系统,该文件系统将作为Windows共享进行访问。

看来Alfresco JLan正在做这项工作。到目前为止,从这个答案开始,我有一些有希望的结果:如何将alfresco jlan文件服务器设置为独立的java包?

现在,我似乎无法实际进行身份验证。我的虚拟实现总是成功,但是一旦我尝试验证密码,它就会失败。

一些信息:

  • 它运行在Windows计算机上,端口445未被Windows本身使用(服务器服务已禁用等)。
  • 从同一个Windows 10客户端来看,JLan似乎将其视为ntlmv1身份验证,这对我来说很奇怪(我至少期望ntlmv2)。alg == NTLM1 in JLan's .CifsAuthenticator::validatePassword
  • 加密使用的密码似乎是74字节,而它期望的24字节,并且它失败了。
  • 不得不删除似乎不再存在的CryptixCrypto,并在JLan中替换,因为它似乎是在现代Java平台上前进的方式(MD4默认情况下不注册,如MD4类本身所记录的那样)。getInstance("MD4")MD4.getInstance()

如何再次检查我的密码一些纯文本密码?


答案 1

我使用这两个库取得了巨大的成功。我能够向提供 SMB 共享的 Synology NAS 进行身份验证。

请注意,我使用的版本不必是最新版本。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-vfs2</artifactId>
    <version>2.4.1</version>
</dependency>
<dependency>
    <groupId>eu.agno3.jcifs</groupId>
    <artifactId>jcifs-ng</artifactId>
    <version>2.1.5</version>
</dependency>

用于身份验证的代码可能如下所示:

final String smburl = ...;
final String username = ...;
final String password = ...;

final URI uri = new URI(smburl);

StaticUserAuthenticator auth = new StaticUserAuthenticator(null, username, password);

Properties jcifsProperties = new Properties();

// these settings are needed for 2.0.x to use anything but SMB1, 2.1.x enables by default and will ignore
jcifsProperties.setProperty("jcifs.smb.client.enableSMB2", "true");
jcifsProperties.setProperty("jcifs.smb.client.useSMB2Negotiation", "true");
CIFSContext jcifsContext = new BaseContext(new PropertyConfiguration(jcifsProperties));

FileSystemOptions options = new FileSystemOptions();
DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(options, auth);
SmbFileSystemConfigBuilder.getInstance().setCIFSContext(options, jcifsContext);

fsManager = VFS.getManager();

最后,使用 fsManager 将 URI 解析为文件对象并执行必要的操作。


答案 2

推荐