2023年5月6日18:26:37

master
zhangmeng 2023-05-06 18:26:46 +08:00
parent e2bde5f722
commit 437501f411
7 changed files with 261 additions and 40 deletions

View File

@ -562,4 +562,28 @@ public class CodecToolsController {
public void maven_jar_install_menu_item(ActionEvent event) { public void maven_jar_install_menu_item(ActionEvent event) {
load_small_tools(10); load_small_tools(10);
} }
public void jks_file_menu_item(ActionEvent event) {
}
public void music_parser_menu_item(ActionEvent event) {
}
public void word_ocr_menu_item(ActionEvent event) {
}
public void bar_code_menu_item(ActionEvent event) {
}
public void pdf_menu_item(ActionEvent event) {
}
public void batch_update_file_name_menu_item(ActionEvent event) {
}
} }

View File

@ -0,0 +1,118 @@
package com.zhangmeng.tools.controller;
import com.zhangmeng.tools.utils.AlertUtils;
import com.zhangmeng.tools.utils.ImagePath;
import com.zhangmeng.tools.utils.JksUtils;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* @author :
* @version : 1.0
* @date : 2023-05-06 16:43
*/
public class JksFileController {
@FXML
public TextField dir;
@FXML
public Button choose_file;
@FXML
public Button x509_gen;
@FXML
public TextField jks_file_name;
@FXML
public TextField cer_file_name;
@FXML
public Button jks_gen;
@FXML
public TextArea jks_public;
@FXML
public TextArea cer_public;
@FXML
public TextArea jks_private;
@FXML
public void initialize() {
choose_file.setText(null);
ImageView iv = new ImageView(new Image(ImagePath.path(ImagePath.ImagePathType.IMAGE_FILE)));
iv.setPreserveRatio(true);
iv.setFitWidth(18);
choose_file.setGraphic(iv);
choose_file.setOnAction(event -> {
Stage stage = new Stage();
DirectoryChooser dc = new DirectoryChooser();
dc.setTitle("文件夹选择器");
File file = dc.showDialog(stage);
if (file != null) {
String path = file.getAbsolutePath();
dir.setText(path);
}
});
x509_gen.setOnAction(event -> {
if (dir.getText().length() == 0) {
AlertUtils.alert_warning("文件夹不能为空!");
return;
}
String content = JksUtils.GetCertFile.x509Certificate(dir.getText());
cer_public.setText(content);
});
jks_gen.setOnAction(event -> {
if (dir.getText().length() == 0) {
AlertUtils.alert_warning("文件夹不能为空!");
return;
}
if (jks_file_name.getText().length() == 0) {
AlertUtils.alert_warning("jks文件名不能为空!");
return;
}
JksUtils.GetJksAndCerFile.jks_cer(dir.getText() + jks_file_name.getText(), "123456", "123456", dir.getText() + cer_file_name.getText());
Path path = Paths.get(dir.getText() + jks_file_name.getText());
Path path2 = Paths.get(dir.getText() + cer_file_name.getText());
try {
while (true){
if (Files.exists(path) && Files.exists(path2)){
break;
}
}
JksUtils.GetJksAndCerFile.readJks(dir.getText() + jks_file_name.getText(), "123456");
JksUtils.GetJksAndCerFile.readCer(dir.getText() + cer_file_name.getText());
} catch (Exception e) {
e.printStackTrace();
}
});
}
}

View File

@ -1,18 +1,24 @@
package com.zhangmeng.tools.utils; package com.zhangmeng.tools.utils;
import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64; import org.bouncycastle.util.encoders.Base64;
import org.bouncycastle.x509.X509V3CertificateGenerator; import org.bouncycastle.x509.X509V3CertificateGenerator;
import javax.security.auth.x500.X500Principal; import javax.security.auth.x500.X500Principal;
import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.math.BigInteger; import java.math.BigInteger;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.*; import java.security.*;
import java.security.cert.Certificate; import java.security.cert.Certificate;
import java.security.cert.CertificateFactory; import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Enumeration; import java.util.Enumeration;
@ -21,6 +27,7 @@ import java.util.Enumeration;
* @version : 1.0 * @version : 1.0
* @date : 2023-04-23 09:17 * @date : 2023-04-23 09:17
*/ */
@Slf4j
public class JksUtils { public class JksUtils {
public static class GetCertFile { public static class GetCertFile {
@ -30,14 +37,25 @@ public class JksUtils {
//证书使用者 //证书使用者
static String CertificateUser = "C=中国,ST=广东,L=广州,O=人民组织,OU=人民单位,CN="; static String CertificateUser = "C=中国,ST=广东,L=广州,O=人民组织,OU=人民单位,CN=";
public static void main(String[] args) { public static String x509Certificate(String dir){
Path path = Paths.get(dir + file_name() + ".cer");
try { try {
X509Certificate cert = getCert(); if (!Files.exists(path)){
System.out.println(cert.toString()); Files.createFile(path);
}
X509Certificate cert = getCert(path.toFile());
return cert.toString();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
return null;
} }
public static String file_name(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
return sdf.format(new Date());
}
/* /*
* CN(Common Name) * CN(Common Name)
* OU(Organization Unit) * OU(Organization Unit)
@ -45,8 +63,10 @@ public class JksUtils {
* ST(State) * ST(State)
* C(Country) * C(Country)
* L(Locality) * L(Locality)
*
* "F:\\cer.cer"
* */ * */
public static X509Certificate getCert() throws Exception { public static X509Certificate getCert(File file) throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024); keyPairGenerator.initialize(1024);
KeyPair keyPair = keyPairGenerator.generateKeyPair(); KeyPair keyPair = keyPairGenerator.generateKeyPair();
@ -70,7 +90,7 @@ public class JksUtils {
Security.addProvider(new BouncyCastleProvider()); Security.addProvider(new BouncyCastleProvider());
X509Certificate x509Certificate = x509V3CertificateGenerator.generateX509Certificate(keyPair.getPrivate(), "BC"); X509Certificate x509Certificate = x509V3CertificateGenerator.generateX509Certificate(keyPair.getPrivate(), "BC");
//写入文件 //写入文件
FileOutputStream fos = new FileOutputStream("F:\\cer.cer"); FileOutputStream fos = new FileOutputStream(file);
fos.write(x509Certificate.getEncoded()); fos.write(x509Certificate.getEncoded());
fos.flush(); fos.flush();
fos.close(); fos.close();
@ -80,31 +100,33 @@ public class JksUtils {
public static class GetJksAndCerFile { public static class GetJksAndCerFile {
public static void main(String[] args) { public static void jks_cer(String file,String keypass,String storepass,String cer_file) {
buildKeyAndSaveToJksFile(); buildKeyAndSaveToJksFile(file, keypass, storepass);
exportCerFile(); exportCerFile(file,cer_file);
try { // try {
readJks(); // readJks(file,keypass);
readCer(); // readCer(cer_file);
} catch (Exception e) { // } catch (Exception e) {
e.printStackTrace(); // e.printStackTrace();
// }
} }
}
public static void executeCommand(String[] arstringCommand) { public static void executeCommand(String[] arstringCommand) {
try { try {
Runtime.getRuntime().exec(arstringCommand); Runtime.getRuntime().exec(arstringCommand);
} catch (Exception e) { } catch (Exception e) {
System.out.println(e.getMessage()); log.error(e.getMessage());
} }
} }
/**
*
* @param file //f:/demo.jks
* @param keypass 123456
* @param storepass 123456
*/
//生成密钥并保存到jks文件 //生成密钥并保存到jks文件
public static void buildKeyAndSaveToJksFile() { public static void buildKeyAndSaveToJksFile(String file,String keypass,String storepass) {
String[] command = new String[]{ String[] command = new String[]{
"cmd ", "cmd ",
"/k", "/k",
@ -124,11 +146,11 @@ public class JksUtils {
"-validity", // 有效天数 "-validity", // 有效天数
"36500", "36500",
"-keypass",// 密钥口令(私钥的密码) "-keypass",// 密钥口令(私钥的密码)
"123456", keypass,
"-keystore", //密钥库名称(jks文件路径) "-keystore", //密钥库名称(jks文件路径)
"f:/demo.jks", file,
"-storepass", // 密钥库口令(jks文件的密码) "-storepass", // 密钥库口令(jks文件的密码)
"123456", storepass,
"-v"// 详细输出(秘钥库中证书的详细信息) "-v"// 详细输出(秘钥库中证书的详细信息)
}; };
executeCommand(command); executeCommand(command);
@ -136,7 +158,7 @@ public class JksUtils {
//从jks文件中导出证书文件 //从jks文件中导出证书文件
public static void exportCerFile() { public static void exportCerFile(String jks_file,String cer_file) {
String[] command = new String[]{ String[] command = new String[]{
"cmd ", "/k", "cmd ", "/k",
"start", // cmd Shell命令 "start", // cmd Shell命令
@ -146,43 +168,61 @@ public class JksUtils {
"-alias", // -alias指定别名这里是ss "-alias", // -alias指定别名这里是ss
"sun", "sun",
"-keystore", // -keystore指定keystore文件这里是d:/demo.keystore "-keystore", // -keystore指定keystore文件这里是d:/demo.keystore
"f:/demo.jks", jks_file,
"-rfc", "-rfc",
"-file",//-file指向导出路径 "-file",//-file指向导出路径
"f:/demo.cer", cer_file,
"-storepass",// 指定密钥库的密码 "-storepass",// 指定密钥库的密码
"123456" "123456"
}; };
executeCommand(command); executeCommand(command);
} }
public static class JKSInfo{
private String private_key;
private String public_key;
public String getPrivate_key() {
return private_key;
}
public void setPrivate_key(String private_key) {
this.private_key = private_key;
}
public String getPublic_key() {
return public_key;
}
public void setPublic_key(String public_key) {
this.public_key = public_key;
}
}
//读取jks文件获取公、私钥 //读取jks文件获取公、私钥
public static void readJks() throws Exception { public static void readJks(String file,String keypass) throws Exception {
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(new FileInputStream("f:\\demo.jks"), "123456".toCharArray()); keyStore.load(new FileInputStream(file), keypass.toCharArray());
Enumeration<String> aliases = keyStore.aliases(); Enumeration<String> aliases = keyStore.aliases();
String alias = null; String alias = null;
while (aliases.hasMoreElements()) { while (aliases.hasMoreElements()) {
alias = aliases.nextElement(); alias = aliases.nextElement();
} }
System.out.println("jks文件别名是" + alias); log.info("jks文件别名是" + alias);
PrivateKey key = (PrivateKey) keyStore.getKey(alias, "123456".toCharArray()); PrivateKey key = (PrivateKey) keyStore.getKey(alias, "123456".toCharArray());
System.out.println("jks文件中的私钥是" + new String(Base64.encode(key.getEncoded()))); System.out.println("jks文件中的私钥是" + new String(Base64.encode(key.getEncoded())));
Certificate certificate = keyStore.getCertificate(alias); Certificate certificate = keyStore.getCertificate(alias);
PublicKey publicKey = certificate.getPublicKey(); PublicKey publicKey = certificate.getPublicKey();
System.out.println("jks文件中的公钥:" + new String(Base64.encode(publicKey.getEncoded()))); log.info("jks文件中的公钥:" + new String(Base64.encode(publicKey.getEncoded())));
} }
//读取证书文件获取公钥 //读取证书文件获取公钥
public static void readCer() throws Exception { public static void readCer(String file) throws Exception {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
Certificate certificate = Certificate certificate = certificateFactory.generateCertificate(new FileInputStream(file));
certificateFactory.generateCertificate(new FileInputStream("f:\\demo.cer"));
PublicKey publicKey = certificate.getPublicKey(); PublicKey publicKey = certificate.getPublicKey();
System.out.println("证书中的公钥:" + new String(Base64.encode(publicKey.getEncoded()))); log.info("证书中的公钥:" + new String(Base64.encode(publicKey.getEncoded())));
} }
} }
} }

View File

@ -51,7 +51,7 @@ public class ResourcesUtils {
public enum Menu { public enum Menu {
Md5("md5加密", 0), Md5("md5加密", 0),
SpringSecurity("spring加密", 1), SpringSecurity("spring加密", 1),
Jks_File("spring加密", 2), Jks_File("Jks_File", 2),
; ;

View File

@ -15,8 +15,9 @@
<Menu mnemonicParsing="false" text="加密工具"> <Menu mnemonicParsing="false" text="加密工具">
<items> <items>
<MenuItem mnemonicParsing="false" onAction="#md5_menu_item" text="md5 加密"/> <MenuItem mnemonicParsing="false" onAction="#md5_menu_item" text="md5 加密"/>
<MenuItem mnemonicParsing="false" onAction="#spring_security_menu_item" <MenuItem mnemonicParsing="false" onAction="#spring_security_menu_item" text="spring security 加密"/>
text="spring security 加密"/> <MenuItem mnemonicParsing="false" onAction="#jks_file_menu_item" text="jkd 文件生成"/>
</items> </items>
</Menu> </Menu>
<Menu mnemonicParsing="false" text="影音工具"> <Menu mnemonicParsing="false" text="影音工具">
@ -24,6 +25,7 @@
<MenuItem mnemonicParsing="false" text="视频播放" onAction="#video_menu_item"/> <MenuItem mnemonicParsing="false" text="视频播放" onAction="#video_menu_item"/>
<MenuItem mnemonicParsing="false" text="音乐播放" onAction="#music_menu_item"/> <MenuItem mnemonicParsing="false" text="音乐播放" onAction="#music_menu_item"/>
<MenuItem mnemonicParsing="false" text="vip 视频解析" onAction="#vip_parser_menu_item"/> <MenuItem mnemonicParsing="false" text="vip 视频解析" onAction="#vip_parser_menu_item"/>
<MenuItem mnemonicParsing="false" text="音乐解析" onAction="#music_parser_menu_item"/>
</items> </items>
</Menu> </Menu>
<Menu mnemonicParsing="false" text="常用小工具"> <Menu mnemonicParsing="false" text="常用小工具">
@ -39,6 +41,10 @@
<MenuItem mnemonicParsing="false" text="手机号工具" onAction="#telephone_menu_item"/> <MenuItem mnemonicParsing="false" text="手机号工具" onAction="#telephone_menu_item"/>
<MenuItem mnemonicParsing="false" text="JsonView" onAction="#JsonView_menu_item"/> <MenuItem mnemonicParsing="false" text="JsonView" onAction="#JsonView_menu_item"/>
<MenuItem mnemonicParsing="false" text="maven-jar-install" onAction="#maven_jar_install_menu_item"/> <MenuItem mnemonicParsing="false" text="maven-jar-install" onAction="#maven_jar_install_menu_item"/>
<MenuItem mnemonicParsing="false" text="word-ocr" onAction="#word_ocr_menu_item"/>
<MenuItem mnemonicParsing="false" text="条形码识别" onAction="#bar_code_menu_item"/>
<MenuItem mnemonicParsing="false" text="pdf识别" onAction="#pdf_menu_item"/>
<MenuItem mnemonicParsing="false" text="批量修改文件名" onAction="#batch_update_file_name_menu_item"/>
</items> </items>
</Menu> </Menu>
@ -51,10 +57,11 @@
</items> </items>
</Menu> </Menu>
<Menu mnemonicParsing="false" text="sql工具"> <Menu mnemonicParsing="false" text="代码工具">
<items> <items>
<MenuItem mnemonicParsing="false" text="mysql代码生成" onAction="#sql_code_gen_menu_item"/> <MenuItem mnemonicParsing="false" text="mysql代码生成" onAction="#sql_code_gen_menu_item"/>
<MenuItem mnemonicParsing="false" text="mybatis-plus 代码生成" onAction="#mybatis_plus_gen_menu_item"/> <MenuItem mnemonicParsing="false" text="mybatis-plus 代码生成" onAction="#mybatis_plus_gen_menu_item"/>
<MenuItem mnemonicParsing="false" text="json转javaBean 代码生成" onAction="#json_javabean_gen_menu_item"/>
</items> </items>
</Menu> </Menu>
@ -72,6 +79,10 @@
<MenuItem mnemonicParsing="false" text="ftp-server 请求工具" onAction="#ftp_server_menu_item"/> <MenuItem mnemonicParsing="false" text="ftp-server 请求工具" onAction="#ftp_server_menu_item"/>
<MenuItem mnemonicParsing="false" text="ssh-client 请求工具" onAction="#ssh_client_menu_item"/> <MenuItem mnemonicParsing="false" text="ssh-client 请求工具" onAction="#ssh_client_menu_item"/>
<MenuItem mnemonicParsing="false" text="socket-server 服务工具" onAction="#socket_server_menu_item"/> <MenuItem mnemonicParsing="false" text="socket-server 服务工具" onAction="#socket_server_menu_item"/>
<MenuItem mnemonicParsing="false" text="socket-client-aio 客户端工具" onAction="#socket_client_aio_menu_item"/>
<MenuItem mnemonicParsing="false" text="socket-server-aio 服务端工具" onAction="#socket_server_aio_menu_item"/>
<MenuItem mnemonicParsing="false" text="socket-server-nio 服务端工具" onAction="#socket_server_nio_menu_item"/>
<MenuItem mnemonicParsing="false" text="socket-client-nio 客户端工具" onAction="#socket_client_nio_menu_item"/>
</items> </items>
</Menu> </Menu>
</menus> </menus>

View File

@ -84,7 +84,7 @@
<MenuItem mnemonicParsing="false" text="socket-client-aio 客户端工具" onAction="#socket_client_aio_menu_item"/> <MenuItem mnemonicParsing="false" text="socket-client-aio 客户端工具" onAction="#socket_client_aio_menu_item"/>
<MenuItem mnemonicParsing="false" text="socket-server-aio 服务端工具" onAction="#socket_server_aio_menu_item"/> <MenuItem mnemonicParsing="false" text="socket-server-aio 服务端工具" onAction="#socket_server_aio_menu_item"/>
<MenuItem mnemonicParsing="false" text="socket-server-nio 服务端工具" onAction="#socket_server_nio_menu_item"/> <MenuItem mnemonicParsing="false" text="socket-server-nio 服务端工具" onAction="#socket_server_nio_menu_item"/>
<MenuItem mnemonicParsing="false" text="socket-client-nio 服务端工具" onAction="#socket_client_nio_menu_item"/> <MenuItem mnemonicParsing="false" text="socket-client-nio 客户端工具" onAction="#socket_client_nio_menu_item"/>
</items> </items>
</Menu> </Menu>
</menus> </menus>

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="649.0" prefWidth="1200.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.zhangmeng.tools.controller.JksFileController">
<children>
<TextField fx:id="dir" layoutX="101.0" layoutY="18.0" prefHeight="25.0" prefWidth="474.0" />
<Button fx:id="choose_file" layoutX="598.0" layoutY="18.0" mnemonicParsing="false" text="Button" />
<TextArea fx:id="jks_public" layoutX="114.0" layoutY="110.0" prefHeight="170.0" prefWidth="1045.0" />
<Button layoutX="1025.0" layoutY="18.0" mnemonicParsing="false" text="x509Certificate-生成" fx:id="x509_gen" />
<Label layoutX="40.0" layoutY="22.0" text="生成路径:" />
<Label layoutX="137.0" layoutY="458.0" />
<Label layoutX="38.0" layoutY="73.0" text="jks文件名:" />
<TextField fx:id="jks_file_name" layoutX="101.0" layoutY="69.0" />
<TextField fx:id="cer_file_name" layoutX="365.0" layoutY="69.0" />
<Label layoutX="293.0" layoutY="73.0" text="cer文件名:" />
<TextArea fx:id="cer_public" layoutX="114.0" layoutY="483.0" prefHeight="143.0" prefWidth="1117.0" />
<Button fx:id="jks_gen" layoutX="606.0" layoutY="69.0" mnemonicParsing="false" text="生成" />
<Label layoutX="50.0" layoutY="117.0" text="JKS 公钥:" />
<Label layoutX="41.0" layoutY="308.0" text="JKS 私钥:" />
<TextArea fx:id="jks_private" layoutX="114.0" layoutY="308.0" prefHeight="143.0" prefWidth="1045.0" />
<Label layoutX="50.0" layoutY="483.0" text="证书公钥:" />
</children>
</AnchorPane>