Wir hatten auch ein ähnliches Problem, aber wir haben unsere eigene Verschlüsselungs- und Entschlüsselungslogik entwickelt, um das Problem anzugehen. Hier ist der Code
/* class is used to generate encrypted password */
public class ClientForPasswordGeneration {
public static void main(String[] args) {
//final String secretKey = "ssshhhhhhhhhhh!!!!";
final String secretKey = PasswordKey.getEncryptionKey();
GenerateLogic object = new GenerateLogic();
String password = PasswordField.readPassword("Enter password: ");
String encryptPassword = object.encrypt(password, secretKey);
System.out.println("Encrypted Password:");
System.out.println(encryptPassword);
}
}
Eine andere Klasse
class EraserThread implements Runnable {
private boolean stop;
/**
* @param The
* prompt displayed to the user
*/
public EraserThread(String prompt) {
System.out.print(prompt);
}
/**
* Begin masking...display asterisks (*)
*/
public void run() {
stop = true;
while (stop) {
System.out.print("\010*");
try {
Thread.currentThread().sleep(1);
// System.out.println("current thread::" + Thread.currentThread());
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
}
/**
* Instruct the thread to stop masking
*/
public void stopMasking() {
this.stop = false;
}
}
Logik, die Hash-Code erzeugt
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class GenerateLogic {
private static SecretKeySpec secretKey;
private static byte[] key;
public static void setKey(String myKey) {
MessageDigest sha = null;
try {
key = myKey.getBytes("UTF-8");
sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
key = Arrays.copyOf(key, 16);
secretKey = new SecretKeySpec(key, "AES");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public static String encrypt(String strToEncrypt, String secret) {
try {
setKey(secret);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
} catch (Exception e) {
System.out.println("Error while encrypting: " + e.toString());
}
return null;
}
public static String decrypt(String strToDecrypt) {
try {
//System.out.println("decryptedString methods");
//String secret = "ssshhhhhhhhhhh!!!!";
String secret = PasswordKey.getEncryptionKey();
setKey(secret);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
//System.out.println("testing string values::" + new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt))));
return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
} catch (Exception e) {
System.out.println("Error while decrypting: " + e.toString());
}
return null;
}
public static void main(String[] args) {
final String secretKey = "ssshhhhhhhhhhh!!!!";
String originalString = "changeit";
String encryptedString = GenerateLogic.encrypt(originalString, secretKey);
String decryptedString = GenerateLogic.decrypt(encryptedString);
System.out.println(originalString);
System.out.println(encryptedString);
System.out.println(decryptedString);
}
}
Dies ist, wo wir die Klasse org.apache.coyote.http11.Http11Nio2Protocol erweitert, die ist vorhanden in tomcat-coyote-8.0.29.jar welches im lib-ordner von tomcat 8 vorhanden ist.Beim Kompilieren dieser Klassen sollte also tomcat-coyote-8.0.29.jar vorhanden sein.
public class Http11Nio2Protocol extends org.apache.coyote.http11.Http11Nio2Protocol {
@Override
public void setKeystorePass(String s) {
try {
super.setKeystorePass(new GenerateLogic().decrypt(s));
} catch (final Exception e) {
super.setKeystorePass("");
}
}
}
Dies ist, wo Benutzer-Passwort in cmd eingeben muss, die
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class PasswordField {
/**
* @param prompt
* The prompt to display to the user
* @return The password as entered by the user
*/
public static String readPassword(String prompt) {
EraserThread et = new EraserThread(prompt);
Thread mask = new Thread(et);
mask.start();
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String password = "";
try {
password = in.readLine();
} catch (IOException ioe) {
ioe.printStackTrace();
}
// stop masking
et.stopMasking();
// return the password entered by the user
return password;
}
}
Dies ist, wo Sie Ihr Passwort Schlüssel halten gehasht werden soll. Du solltest es ändern.
public class PasswordKey {
private static String ENCRYPTION_KEY = "myKeysecretkey";
protected static String getEncryptionKey()
{
return ENCRYPTION_KEY;
}
}
kompilieren über Klassen zum Generieren von Klassendateien mit unter Befehl in cmd. Denken Sie daran, dass tomcat-coyote-8.0.29.jar im selben Ordner vorhanden sein sollte, in dem alle Java-Dateien vorhanden sind.
javac -cp ".;tomcat-coyote-8.0.29.jar" *.java
Machen Sie ein Glas mit der Datei generierte Klasse diesen Befehl in cmd
jar -cvf PasswordEncryptor.jar *.class
Diese
Fügen Sie den erzeugten PasswordEncryptor.jar in Ordner lib eine JAR-Datei PasswordEncryptor.jar schaffen Tomcat8. d. h. apache-tomcat-8.5.9 \ lib
Gehen Sie nun zu diesem Speicherort und geben Sie den folgenden Befehl ein, um das Hash-Passwort zu generieren.
java -cp ".;PasswordEncryptor.jar" ClientForPasswordGeneration
Gehen Sie jetzt zu Apache-tomcat-8.5.9 \ conf und bearbeiten server.xml
Verwenden Sie das Hash-Passwort in keystorpasss von Zertifikat
<Connector port="9443" protocol="Http11Nio2Protocol" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="C:\Certificates\SSLCert.cert" keystorePass="nOS74yuWW4s18TsL2UJ51A=="/>
Beachten Sie die Protokoll ist der Name der benutzerdefinierten Klasse.
Hoffe, das wird Ihnen helfen.
Dank
Wo waren Sie zum Speichern des Verschlüsselungsschlüssels zu denken, das Passwort zu entsperren die keys zu entsperren? Nur aus Interesse. – david99world
Ich bin mir bewusst, dass dies keine einfache Frage ist. Ich möchte wissen, ob es eine Standardlösung gibt. – AdiB
Nein, es gibt eine andere Standardlösung als _maybe_, die den Connector wie unten erwähnt überschreibt, aber das ist in keiner Weise eine Standardlösung und eher ein Down-Right-Hack. – david99world