将java流切换为密码流
我正在尝试创建一个协议,让客户端向服务器发送它的登录名。在此之后,服务器从服务器获取客户端密码,并由此创建一个密码密钥。客户端根据输入的密码创建密钥。通过这种方式,我试图获得一个安全的连接 但是,在发送用户名、获取密码等之后,我试图从cypherstream创建一个新的objectinputstream来读取数据,但它会阻塞。我找不到办法让它工作,即使在看了很多其他类似的问题之后 服务器端将java流切换为密码流,java,sockets,encryption,objectinputstream,Java,Sockets,Encryption,Objectinputstream,我正在尝试创建一个协议,让客户端向服务器发送它的登录名。在此之后,服务器从服务器获取客户端密码,并由此创建一个密码密钥。客户端根据输入的密码创建密钥。通过这种方式,我试图获得一个安全的连接 但是,在发送用户名、获取密码等之后,我试图从cypherstream创建一个新的objectinputstream来读取数据,但它会阻塞。我找不到办法让它工作,即使在看了很多其他类似的问题之后 服务器端 private void switchToChipherStreams(String username)
private void switchToChipherStreams(String username) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {
byte key[] = dbMediator.getPasswordCypher(username);
SecretKey key64 = new SecretKeySpec(key, "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, key64);
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
}
out = new ObjectOutputStream(new CipherOutputStream(socket.getOutputStream(), cipher));
out.reset();
out.flush();
out.writeObject("switch");
in = new ObjectInputStream(new CipherInputStream(socket.getInputStream(), cipher));
}
private void switchToChipherStreams(String password) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {
//Generate key
byte[] key = new byte[8];
for (int i = 0; i < 8; i++) {
if (password.length() > i) {
key[i] = password.getBytes()[i];
} else {
key[i] = (byte) i;
}
}
//Setup cipher streams
SecretKey key64 = new SecretKeySpec(key, "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, key64);
in = new ObjectInputStream(new CipherInputStream(socket.getInputStream(), cipher));
out = new ObjectOutputStream(new CipherOutputStream(socket.getOutputStream(), cipher));
out.reset();
out.flush();
out.writeObject("switch");
}
byte key[] = dbMediator.getPasswordCypher(username);
SecretKey key64 = new SecretKeySpec(key, "Blowfish");
Cipher cipheren = Cipher.getInstance("Blowfish");
cipheren.init(Cipher.ENCRYPT_MODE, key64);
Cipher cipherde = Cipher.getInstance("Blowfish");
cipheren.init(Cipher.DECRYPT_MODE, key64);
out = new ObjectOutputStream(new CipherOutputStream(socket.getOutputStream(), cipheren));
out.reset();
out.flush();
out.writeObject("switch");
in = new ObjectInputStream(new CipherInputStream(socket.getInputStream(), cipherde));
//Generate key
byte[] key = new byte[8];
for (int i = 0; i < 8; i++) {
if (password.length() > i) {
key[i] = password.getBytes()[i];
} else {
key[i] = (byte) i;
}
}
//Setup cipher streams
SecretKey key64 = new SecretKeySpec(key, "Blowfish");
Cipher cipheren = Cipher.getInstance("Blowfish");
cipheren.init(Cipher.ENCRYPT_MODE, key64);
Cipher cipherde = Cipher.getInstance("Blowfish");
cipheren.init(Cipher.DECRYPT_MODE, key64);
out = new ObjectOutputStream(new CipherOutputStream(socket.getOutputStream(), cipheren));
out.reset();
out.flush();
out.writeObject("switch");
in = new ObjectInputStream(new CipherInputStream(socket.getInputStream(), cipherde));
客户端
private void switchToChipherStreams(String username) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {
byte key[] = dbMediator.getPasswordCypher(username);
SecretKey key64 = new SecretKeySpec(key, "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, key64);
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
}
out = new ObjectOutputStream(new CipherOutputStream(socket.getOutputStream(), cipher));
out.reset();
out.flush();
out.writeObject("switch");
in = new ObjectInputStream(new CipherInputStream(socket.getInputStream(), cipher));
}
private void switchToChipherStreams(String password) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {
//Generate key
byte[] key = new byte[8];
for (int i = 0; i < 8; i++) {
if (password.length() > i) {
key[i] = password.getBytes()[i];
} else {
key[i] = (byte) i;
}
}
//Setup cipher streams
SecretKey key64 = new SecretKeySpec(key, "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, key64);
in = new ObjectInputStream(new CipherInputStream(socket.getInputStream(), cipher));
out = new ObjectOutputStream(new CipherOutputStream(socket.getOutputStream(), cipher));
out.reset();
out.flush();
out.writeObject("switch");
}
byte key[] = dbMediator.getPasswordCypher(username);
SecretKey key64 = new SecretKeySpec(key, "Blowfish");
Cipher cipheren = Cipher.getInstance("Blowfish");
cipheren.init(Cipher.ENCRYPT_MODE, key64);
Cipher cipherde = Cipher.getInstance("Blowfish");
cipheren.init(Cipher.DECRYPT_MODE, key64);
out = new ObjectOutputStream(new CipherOutputStream(socket.getOutputStream(), cipheren));
out.reset();
out.flush();
out.writeObject("switch");
in = new ObjectInputStream(new CipherInputStream(socket.getInputStream(), cipherde));
//Generate key
byte[] key = new byte[8];
for (int i = 0; i < 8; i++) {
if (password.length() > i) {
key[i] = password.getBytes()[i];
} else {
key[i] = (byte) i;
}
}
//Setup cipher streams
SecretKey key64 = new SecretKeySpec(key, "Blowfish");
Cipher cipheren = Cipher.getInstance("Blowfish");
cipheren.init(Cipher.ENCRYPT_MODE, key64);
Cipher cipherde = Cipher.getInstance("Blowfish");
cipheren.init(Cipher.DECRYPT_MODE, key64);
out = new ObjectOutputStream(new CipherOutputStream(socket.getOutputStream(), cipheren));
out.reset();
out.flush();
out.writeObject("switch");
in = new ObjectInputStream(new CipherInputStream(socket.getInputStream(), cipherde));
客户端
private void switchToChipherStreams(String username) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {
byte key[] = dbMediator.getPasswordCypher(username);
SecretKey key64 = new SecretKeySpec(key, "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, key64);
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
}
out = new ObjectOutputStream(new CipherOutputStream(socket.getOutputStream(), cipher));
out.reset();
out.flush();
out.writeObject("switch");
in = new ObjectInputStream(new CipherInputStream(socket.getInputStream(), cipher));
}
private void switchToChipherStreams(String password) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {
//Generate key
byte[] key = new byte[8];
for (int i = 0; i < 8; i++) {
if (password.length() > i) {
key[i] = password.getBytes()[i];
} else {
key[i] = (byte) i;
}
}
//Setup cipher streams
SecretKey key64 = new SecretKeySpec(key, "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, key64);
in = new ObjectInputStream(new CipherInputStream(socket.getInputStream(), cipher));
out = new ObjectOutputStream(new CipherOutputStream(socket.getOutputStream(), cipher));
out.reset();
out.flush();
out.writeObject("switch");
}
byte key[] = dbMediator.getPasswordCypher(username);
SecretKey key64 = new SecretKeySpec(key, "Blowfish");
Cipher cipheren = Cipher.getInstance("Blowfish");
cipheren.init(Cipher.ENCRYPT_MODE, key64);
Cipher cipherde = Cipher.getInstance("Blowfish");
cipheren.init(Cipher.DECRYPT_MODE, key64);
out = new ObjectOutputStream(new CipherOutputStream(socket.getOutputStream(), cipheren));
out.reset();
out.flush();
out.writeObject("switch");
in = new ObjectInputStream(new CipherInputStream(socket.getInputStream(), cipherde));
//Generate key
byte[] key = new byte[8];
for (int i = 0; i < 8; i++) {
if (password.length() > i) {
key[i] = password.getBytes()[i];
} else {
key[i] = (byte) i;
}
}
//Setup cipher streams
SecretKey key64 = new SecretKeySpec(key, "Blowfish");
Cipher cipheren = Cipher.getInstance("Blowfish");
cipheren.init(Cipher.ENCRYPT_MODE, key64);
Cipher cipherde = Cipher.getInstance("Blowfish");
cipheren.init(Cipher.DECRYPT_MODE, key64);
out = new ObjectOutputStream(new CipherOutputStream(socket.getOutputStream(), cipheren));
out.reset();
out.flush();
out.writeObject("switch");
in = new ObjectInputStream(new CipherInputStream(socket.getInputStream(), cipherde));
//生成密钥
字节[]键=新字节[8];
对于(int i=0;i<8;i++){
if(password.length()>i){
key[i]=password.getBytes()[i];
}否则{
键[i]=(字节)i;
}
}
//设置密码流
SecretKey key64=新的SecretKeySpec(键“河豚”);
Cipher cipheren=Cipher.getInstance(“河豚”);
cipheren.init(Cipher.ENCRYPT_模式,key64);
Cipher cipherde=Cipher.getInstance(“河豚”);
cipheren.init(Cipher.DECRYPT_模式,key64);
out=新的ObjectOutputStream(新的CipherOutputStream(socket.getOutputStream(),cipheren));
out.reset();
out.flush();
out.writeObject(“开关”);
in=新的ObjectInputStream(新的CipherInputStream(socket.getInputStream(),cipherde));
现在,无效头问题已经解决,但当调用objectinputstream构造函数时,客户端和服务器都会冻结。您不能从同一个密码对象创建密码输入和输出流。您需要两个密码对象,一个处于解密模式,另一个处于加密模式
在两端的
ObjectInputStream
之前创建并刷新ObjectOutputStream
。是否一定要在某个点关闭流?关闭流会导致关闭socket关于在服务器端为每个客户端请求创建一个新线程如何?对于连接到服务器的每个客户端,我正在创建一个新线程线用户发送用户名,服务器从数据库获取密码,并从密码创建密钥,客户端也是如此。如果客户端输入了错误的密码,流将失败。然而,我必须做出改变。但在创建新的objectinputstream时,如果我没有立即向其发送内容,它就会冻结。当我发送东西时,我得到一个无效的头异常。我更改了密码并在两侧创建了objectoutputstream,然后创建了objectinputstream,但在调用objectinputstream的构造函数时它仍然冻结。有些密码使用相同的算法进行加密和解密。@zaph当然有。我没有另外说明。99.999%的流密码属于这一类。关键是关于Cipher
对象,它们不能同时处于两种模式。@JurClerkx在创建ObjectInputStream
之前,请尝试刷新ObjectOutputStream
。底层的CipherOutputStream
可能需要刷新。