Java 通过web服务进行验证并为应用程序保存密码

Java 通过web服务进行验证并为应用程序保存密码,java,save,md5,sharedpreferences,persistent,Java,Save,Md5,Sharedpreferences,Persistent,我正在开发java应用程序,它使用web服务,然后验证用户,我让用户输入用户名和密码。要使用此应用程序,用户需要有效的用户名和密码 我有一个上下文菜单,当有正确的登录时会被激活。否则我希望它被禁用 我只需要一次验证。因此,如果任何其他用户使用来自同一系统的应用程序,他不需要再次输入密码 这意味着我需要在本地系统中保存密码,以便在整个应用程序中使用此密码 关于如何保存密码有什么帮助吗?嗯,您可以使用公钥和私钥来加密或解密密码 编辑: 首先,您必须创建一个公钥/私钥对。为此,您需要openssl工具

我正在开发java应用程序,它使用web服务,然后验证用户,我让用户输入用户名和密码。要使用此应用程序,用户需要有效的用户名和密码

我有一个上下文菜单,当有正确的登录时会被激活。否则我希望它被禁用

我只需要一次验证。因此,如果任何其他用户使用来自同一系统的应用程序,他不需要再次输入密码

这意味着我需要在本地系统中保存密码,以便在整个应用程序中使用此密码


关于如何保存密码有什么帮助吗?

嗯,您可以使用公钥和私钥来加密或解密密码

编辑:

首先,您必须创建一个公钥/私钥对。为此,您需要openssl工具(或直接用于Windows)。 安装它,打开“cmd”(如果您在windows上),导航到您的openssl安装路径并输入以下行以生成服务器和客户端的密钥:

openssl genrsa -out serverPrivateKey.pem 2048
openssl rsa -in serverPrivateKey.pem -pubout -outform DER -out serverPublicKey.der

openssl genrsa -out clientPrivateKey.pem 2048
openssl pkcs8 -topk8 -nocrypt -in clientPrivateKey.pem -outform der -out clientPrivateKey.der
openssl rsa -in clientPrivateKey.pem -pubout -outform PEM -out clientPublicKey.pem
现在,在web service java应用程序中,您可以导入加密的公钥:

File pubKeyFile = new File("keys/serverPublicKey.der");
byte[] buffer = new byte[(int) pubKeyFile.length()];

DataInputStream in = new DataInputStream(new FileInputStream(pubKeyFile));
in.readFully(buffer);
in.close();

KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(new X509EncodedKeySpec(buffer));
并加密您的密码:

String text = password;

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encrypted = cipher.doFinal(text.getBytes());
并将其保存到本地文件系统:

FileOutputStream fos = new FileOutputStream("/tmp/encrypted");
fos.write(encrypted);
fos.flush();
fos.close();
解密的另一种方法

导入私钥:

File privKeyFile = new File("keys/clientPrivateKey.der");
byte[] buffer = new byte[(int) privKeyFile.length()];

DataInputStream in = new DataInputStream(new FileInputStream(privKeyFile));
in.readFully(buffer);
in.close();

KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPrivateKey privateKey = (RSAPrivateKey) keyFactory.generatePrivate(new PKCS8EncodedKeySpec(buffer));
读取加密文件:

File cryptedData = new File("/tmp/encrypted");
buffer = new byte[(int) cryptedData.length()];

in = new DataInputStream(new FileInputStream(cryptedData));
in.readFully(buffer);
in.close();
并对其进行解密:

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
cipher.init(Cipher.DECRYPT_MODE, privateKey);

byte[] decrypted = cipher.doFinal(buffer);

String data = new String(decrypted);

System.out.println(data);
您只需在运行web服务的系统上对私钥保密即可。
您可以提供一个web服务函数,该函数向客户端提供公钥以进行加密。您的客户只需将加密的文本字符串发送到web服务,web服务将对其进行解密并对您的客户进行身份验证。

您能给我一些示例代码吗……请将其保存在系统中,这样它就不会再次询问用户并再次感谢您消除我的疑问。但在我的代码中,我无法从任何第三方软件获得帮助。我正在用java为一些软件制作一个插件,我需要在ActionListener上使用类似“记住我”的选项。但在这种情况下,只要用户点击按钮,它就会自动转到某个文件,下次会自动从那里获取。这不是第三方软件。这是纯Java实现。不,我指的是Openssl工具包。我必须在我将要使用我的软件的每个系统中安装它。不,这是不必要的。您只需要OpenSSL生成一次公钥/私钥对。我没有尝试,但我自己,但似乎你也可以创建一个密钥对在线…但你应该更喜欢命令行工具!