SSHJ Java库:SFTP连接中已弃用加密套件的替代方案咨询
SSHJ中已弃用的AES加密工厂类替代方案
SSHJ库中旧的AES256CTR.Factory、AES256CBC.Factory等加密工厂类已被弃用,替代方案是使用net.schmizz.sshj.common.cipher包中标准化命名的工厂类,或者直接利用库提供的预定义加密套件常量来配置,以下是具体实现方式:
1. 使用预定义的加密套件常量(推荐)
SSHJ在net.schmizz.sshj.common.SecurityUtils中提供了符合现代安全标准的加密套件列表,可直接引用这些常量快速配置你需要的加密算法:
Config config = new DefaultConfig(); // 配置AEAD AES GCM和AES CTR系列加密套件 List<Factory.Named<Cipher>> cipherFactories = SecurityUtils.getCipherFactories( "aes256-gcm", "aes128-gcm", "aes256-ctr", "aes192-ctr", "aes128-ctr" ); config.setCipherFactories(cipherFactories); SSHClient client = new SSHClient(config);
2. 手动构建加密工厂列表(替代旧写法)
如果需要手动实例化工厂类,直接使用net.schmizz.sshj.common.cipher下对应算法的工厂类(类名以Cipher后缀结尾):
protected List<Factory.Named<Cipher>> initCipherFactories() { List<Factory.Named<Cipher>> avail = new LinkedList<>(Arrays.asList( // AES-CTR系列替代类 new AES256CTRCipher.Factory(), new AES192CTRCipher.Factory(), new AES128CTRCipher.Factory(), // AEAD AES-GCM系列 new AES256GCMCipher.Factory(), new AES128GCMCipher.Factory() )); boolean warn = false; // 保留JCE政策兼容性检查(针对旧Java版本) for (Iterator<Factory.Named<Cipher>> i = avail.iterator(); i.hasNext(); ) { final Factory.Named<Cipher> f = i.next(); try { final Cipher c = f.create(); final byte[] key = new byte[c.getBlockSize()]; final byte[] iv = new byte[c.getIVSize()]; c.init(Cipher.Mode.Encrypt, key, iv); } catch (Exception e) { warn = true; i.remove(); e.printStackTrace(); } } if (warn) log.warn("Disabling high-strength ciphers: cipher strengths apparently limited by JCE policy"); return avail; }
补充说明
- AEAD类算法(如AES-GCM)已整合加密和消息认证,无需额外配置MAC算法;
- 若需配置AES-CTR搭配HMAC-SHA2的组合,需同时设置对应的MAC算法:
// 配置HMAC-SHA2系列MAC算法 List<Factory.Named<MAC>> macFactories = SecurityUtils.getMACFactories( "hmac-sha2-512", "hmac-sha2-256" ); config.setMACFactories(macFactories);
内容的提问来源于stack exchange,提问作者Nilesh
相关产品推荐
相关产品推荐

