为什么在java中这个算法的密钥花费太长时间意味着:Session.connect:java.security.InvalidKeyException

时间:2016-05-09 07:15:55

标签: java unix

我见过很多人都问过这个问题并且也回答了。对不起,但我是java的新手,我真的不明白这个概念和解决这个错误的方法。请提供一种方法来解决这个问题。

我用

java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)

javac 1.8.0_77

我使用以下代码检查了JCE强度:

package automation;    
import java.io.IOException;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class Mainjava {

    public static void main(String[] args) {        
                String cryptoAlg = "AES";
                try{
                    SecretKeySpec keyspec = new SecretKeySpec(new byte[32], cryptoAlg);
                    Cipher c = Cipher.getInstance(cryptoAlg + "/CBC/NoPadding");
                    c.init(Cipher.ENCRYPT_MODE, keyspec, new IvParameterSpec(new byte[16]));
                    System.out.println("Success");
                }
                catch(Exception e){
                    System.err.println("************ The Java Virtual Machine can't handle strong cryptography.\n************ This will lead to problems with some services and subsystems!");
                }
            }   }

在上面的代码中,我没有收到错误消息。

你能告诉我我的错误在哪里吗?这是我尝试与unix服务器连接的代码。

    package automation;
import java.io.*;                             
import com.jcraft.jsch.*;     

public class unixConnect {                    
            public static void main(String[] args) {  
                  try{                                                             
                          System.out.println("Inside ConnectEC2");                       
                           JSch jsch=new JSch();                                         
                           System.out.println("setting pem file");                       
                           System.out.println("added key");                              
                           JSch.setConfig("StrictHostKeyChecking", "no");                

                           String password = "Star3009";
                           System.out.println("giving userid");            
                           Session session=jsch.getSession("mon387", "jackets", 22 );
                           session.setPassword(password);
                           System.out.println("trying to connect");               
                           int port1 = session.getPort();                         
                           System.out.println("port1:"+ port1);                   
                           session.connect(3000);                                 
                           System.out.println("connected");                       
                           String command = "cat Mon_Non_Mon_No_Diff.dat;";                                
                           Channel channel = session.openChannel("exec");         
                           channel.setInputStream(null);                          
                           channel.setOutputStream(System.out);                   

                           ( (ChannelExec) channel ).setCommand( command );       
                           channel.connect();                                     

                           InputStream input = channel.getInputStream();          
                           byte[] tmp = new byte[1024];                           

                           while (true) {                                         
                              while (input.available() > 0) {                            
                                  int i = input.read(tmp, 0, 1024);                      
                                  if (i < 0) break;                                      
                                  System.out.print(new String(tmp, 0, i));               
                              }                                                          
                              if (channel.isClosed()){                                   
                                  System.out.println("exit-status: " + channel.getExitStatus());

                                  break;                                                 
                              }                                                          
                          }                                                              
                          Thread.sleep(1000);                                            
                          channel.disconnect();                                          
                          session.disconnect();                                          
                     }                                                                   
                     catch(Exception e){                                                 
                       System.out.println(e);                                            
                     }                                                                   
                  }                                                                      
}

更新:  输出上述代码:

 Inside ConnectEC2
setting pem file
added key
giving userid
trying to connect
port1:22
com.jcraft.jsch.JSchException: Session.connect: java.security.InvalidKeyException: Key is too long for this algorithm

1 个答案:

答案 0 :(得分:0)

从我现在研究的内容中,我可以看到许多其他人遇到与您相同的问题,问题不在您的代码上,这是JDK的一个错误,它被填充并修复,因为他们说这样更新到Java SE 8u45(或更高)应解决问题。同时将jsch更新为0.1.50版本。

虽然,你有第二个例外.. JSchException,好像你没有使用正确的端口连接服务器。问题是,它无限期地等待谈判完成。这是墨西哥的对峙,双方都没有放弃。在session.connect()之前调用session.setTimeout(),或调用session.connect(timeout),使用一些合适的值(3-5秒)。我相信超时是以毫秒为单位。同时将jsch更新为0.1.50 +版本。

此外,如果您正在使用公钥验证,则JSch期望公共密钥文件位于同一目录中(并且添加了.pub的同名)。

原因是在SSH公钥认证协议中,客户端首先向服务器发送可用公钥的列表,然后服务器中的服务器选择一个合适的公钥 - 只需要私钥(并且将需要私钥)如有必要,可以解密)。虽然它(取决于算法和键表示)可能可以从私有计算公钥,但JSch本身不会这样做,所以你必须提供两个键。