【问题标题】:Set allowed transport and MAC ciphers for SSHClient为 SSHClient 设置允许的传输和 MAC 密码
【发布时间】:2021-11-28 10:58:13
【问题描述】:

我正在尝试使用 SSHJ 修改 SSH 客户端,使其仅允许使用某些密码。我在属性文件中有类似这样的属性:

sftp.transport.ciphers = aes256-gcm,aes256-ctr,aes256-etcera
sftp.mac.ciphers = hmac-sha3-512,...

使用 Jsch 限制使用的密码是这样的:

session.setConfig("cipher.s2c", sftpTransportCiphers);
session.setConfig("cipher.c2s", sftpTransportCiphers);

我一直在梳理 SSHJ 的文档,在这一点上,我绕了一圈,可能错过了一些东西,所以最好问问。我没有看到一种干净的方法来获取逗号分隔的字符串并将其转换为 SSHJ 可以识别的密码列表。

非常感谢一个与上述 JSCH 版本类似配置的 SSHJ 的 SSHClient 的简单示例。

【问题讨论】:

  • 你检查过net.schmizz.sshj.DefaultConfig的班级吗?它定义了一个算法工厂列表,例如用于密钥交换。您可能必须从此 DefaultConfig 派生自己的配置类。
  • @Robert Argh 这个选项让我完全忘记了。目前,我已经使用 DefaultConfig 组合了一个有点 hacky 的解决方案,是的。我想我可能需要从中派生出我自己的并添加一些逻辑来更优雅地将属性字符串转换为允许的密码列表。现在我的解决方案是有点臃肿的 stream=>split=>filter=>map=>collect stream 语句。

标签: java encryption ssh sshj


【解决方案1】:

为了将来参考/其他任何想要快速解决方案的人,这里是来自 DefaultConfig 的派生类,正如@Robert 所建议的那样。

    import net.schmizz.sshj.DefaultConfig;
    import net.schmizz.sshj.common.Factory;
    import net.schmizz.sshj.common.LoggerFactory;
    import net.schmizz.sshj.transport.cipher.*;
    import net.schmizz.sshj.transport.mac.MAC;
    import org.slf4j.Logger;

    import java.util.Arrays;
    import java.util.List;
    import java.util.Properties;
    import java.util.stream.Collectors;

    public class MyConfig extends DefaultConfig {
        private Logger logger;

        public MyConfig() {
            super();
            setLoggerFactory(LoggerFactory.DEFAULT);
        }

        @Override
        void setLoggerFactory(LoggerFactory loggerFactory) {
            super.setLoggerFactory(loggerFactory);
            logger = loggerFactory.getLogger(getClass());
        }

        public void setTransportCiphers(String input) {
            String[] ciphers = input.trim().split(",");
            List<String> factoryNames = Factory.Named.Util.getNames(getCipherFactories());

            List<Factory.Named<Cipher>> transportCiphers = Arrays.stream(ciphers)
                .filter(factoryNames::contains)
                .map(cipher -> Factory.Named.Util.get(getCipherFactories(), cipher))
                .collect(Collectors.toList());

            logger.info("Client-side cipher factories set to: {}", transportCiphers);

            setCipherFactories(transportCiphers);
        }

        public void setMacCiphers(String input) {
            String[] ciphers = input.trim().split(",");
            List<String> factoryNames = Factory.Named.Util.getNames(getMACFactories());

            List<Factory.Named<MAC>> macCiphers = Arrays.stream(ciphers)
                .filter(factoryNames::contains)
                .map(mac -> Factory.Named.Util.get(getMACFactories(), mac))
                .collect(Collectors.toList());

            logger.info(Client-side MAC factories set to: {}", Factory.Named.Util.getNames(macCiphers));

            setMACFactories(macCiphers);
        }
    }

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 2013-03-29
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多