如何为SSHJ的SSHClient配置允许的传输和MAC加密算法
SSHJ限制指定加密算法配置方案
直接通过自定义DefaultConfig转换逗号分隔的配置字符串,即可实现和JSch等效的加密算法限制效果,完整实现示例如下:
import net.schmizz.sshj.SSHClient; import net.schmizz.sshj.DefaultConfig; import net.schmizz.sshj.common.Factory; import java.util.Arrays; import java.util.stream.Collectors; // 从配置文件读取加密算法配置 String transportCiphersStr = "aes256-gcm,aes256-ctr,aes256-etcera"; String macCiphersStr = "hmac-sha3-512,..."; DefaultConfig sshConfig = new DefaultConfig(); // 转换并设置传输加密算法,等效于JSch的cipher.s2c、cipher.c2s配置 var cipherFactories = Arrays.stream(transportCiphersStr.split(",")) .map(String::trim) .map(cipherName -> Factory.Named.Util.find(sshConfig.getCipherFactories(), cipherName)) .collect(Collectors.toList()); sshConfig.setCipherFactories(cipherFactories); // 转换并设置MAC算法 var macFactories = Arrays.stream(macCiphersStr.split(",")) .map(String::trim) .map(macName -> Factory.Named.Util.find(sshConfig.getMACFactories(), macName)) .collect(Collectors.toList()); sshConfig.setMACFactories(macFactories); // 使用自定义配置初始化SSHClient SSHClient sshClient = new SSHClient(sshConfig); // 后续正常执行连接、认证、SFTP操作即可
注意事项
- 算法名称需和SSHJ内置支持的名称完全匹配,若配置了未内置的算法,
find方法会返回null,需自行实现对应算法工厂后再注册使用。 - 配置的算法列表会同时作用于客户端到服务端、服务端到客户端的双向通信,和JSch原有配置逻辑一致。
- 算法协商优先级按配置字符串中的排列顺序生效,排在前面的算法会优先被使用。
内容的提问来源于stack exchange,提问作者quantumferret
相关产品推荐
相关产品推荐

