一个简单功能,主要是备存一下代码
这功能的想法,有些文档,基于安全考虑,不能明文写上密码,所以密码要么单独存储,要么就存加密内容,但加密内容每次都要选择和去找工具解密,比较麻烦。索性,就做成url的方式。
相关链接:
上图看看:
加密内容和生成链接地址
输入密钥
输出u结果
相关代码:
密码本
类型:
输入:
密钥:
编码:
过滤空格
填充:
跳转URL地址:
输出:
<script language="JavaScript" type="text/javascript">
function convertGoUrl() {
let result = $.trim($("#txt_goUrl").val());
if (result == "" || result == "~") {
result = window.location.href;
let pkId = webUtil.httpFn.getQueryString("id");
let idx = result.indexOf('?');
if (idx != -1) {
result = result.substring(0, idx);
}
if (pkId != null && pkId != undefined && pkId != "") {
result = result += "?id=" + pkId;
}
return result;
}
return result;
}
function buildGoUrl(ajaxData, data) {
if (data == null || data == undefined) {
return "";
}
let result = convertGoUrl();
let paramLink = "";
paramLink += "&action=" + escape(ajaxData.action);
if (data != "") {
paramLink += "&input=" + escape(data);
}
if (ajaxData.removeFillKey != null && ajaxData.removeFillKey != undefined) {
switch (ajaxData.removeFillKey) {
case "input":
if (ajaxData.fillPreKey != "") {
paramLink += "&fillPreKey=" + escape(ajaxData.fillPreKey);
}
if (ajaxData.fillPostKey != "") {
paramLink += "&fillPostKey=" + escape(ajaxData.fillPostKey);
}
break;
case "yes":
case "no":
default:
break;
}
paramLink += "&removeFillKey=" + escape(ajaxData.removeFillKey);
}
paramLink += "&decodeFlag=" + (ajaxData.decodeFlag == "1" ? "0" : "1");
if (ajaxData.charsetName != "") {
paramLink += "&charsetName=" + escape(ajaxData.charsetName);
}
paramLink += "&trimFlag=" + escape(ajaxData.trimFlag);
let idx = result.indexOf('?');
if (idx == -1) {
// 去除开头多余的 & 符号
if (paramLink.startsWith("&")) {
paramLink = paramLink.substring(1);
}
result += "?" + paramLink;
} else {
result += paramLink;
}
return result;
}
function onRemoveFillKeyChange() {
let removeFillKey = $("#ddl_removeFillKey").val();
let showFlag = removeFillKey == "input";
if (showFlag) {
$("#txt_fillPreKey").show();
$("#txt_fillPostKey").show();
} else {
$("#txt_fillPreKey").hide();
$("#txt_fillPostKey").hide();
}
}
function onOkClick() {
let ajxData = {};
ajxData["action"] = $.trim($("#ddl_action").val());
ajxData["fillPreKey"] = $.trim($("#txt_fillPreKey").val());
ajxData["fillPostKey"] = $.trim($("#txt_fillPostKey").val());
ajxData["decodeFlag"] = $.trim($("#ddl_decodeFlag").val());
ajxData["input"] = $.trim($("#txt_input").val());
ajxData["secretKey"] = $.trim($("#txt_secretKey").val());
ajxData["charsetName"] = $.trim($("#ddl_charsetName").val());
ajxData["trimFlag"] = $("#chk_trimFlag").is(':checked') ? 1 : 0;
ajxData["removeFillKey"] = $.trim($("#ddl_removeFillKey").val());
let ajaxUrl = serverUrl + "/ctrl/app/tool/common/appToolCommon/encode";
$.ajax({
cache: false,
async: true,
url: ajaxUrl,
data: JSON.stringify(ajxData),
dataType: "json",
contentType: "application/json",
type: "post",
success: function (rData) {
if (rData == null || rData == undefined) {
alert("系统异常");
return;
}
$("#txt_result").val(rData.data);
let goUrl = buildGoUrl(ajxData, rData.data);
$("#txt_url").val(goUrl);
$("#span_execTime").html(webUtil.dateFn.showDateTimeNow());
}
});
}
function toolPageLoad() {
let item = webUtil.httpFn.getQueryString("action", "");
if (item != "") {
$("#ddl_action").val(item);
}
// 从 URL 中获取 "decodeFlag" 参数值,如果没有则默认为空字符串
let decodeFlag = webUtil.httpFn.getQueryString("decodeFlag", "");
if (decodeFlag != "") {
// 如果 "decodeFlag" 参数存在,则设置下拉框 #ddl_decodeFlag 的值
$("#ddl_decodeFlag").val(decodeFlag);
}
// 从 URL 中获取 "input" 参数值,如果没有则默认为空字符串
let input = webUtil.httpFn.getQueryString("input", "");
if (input != "") {
// 如果 "input" 参数存在,则设置文本区域 #txt_input 的值
$("#txt_input").val(input);
}
// 从 URL 中获取 "charsetName" 参数值,如果没有则默认为空字符串
let charsetName = webUtil.httpFn.getQueryString("charsetName", "");
if (charsetName != "") {
// 如果 "charsetName" 参数存在,则设置下拉框 #ddl_charsetName 的值
$("#ddl_charsetName").val(charsetName);
}
// 从 URL 中获取 "trimFlag" 参数值,如果没有则默认为空字符串
let trimFlag = webUtil.httpFn.getQueryString("trimFlag", "");
if (trimFlag != "") {
// 如果 "trimFlag" 为 "1",则勾选复选框 #chk_trimFlag;否则取消勾选
if (trimFlag === "1") {
$("#chk_trimFlag").prop("checked", true);
} else {
$("#chk_trimFlag").prop("checked", false);
}
}
// 从 URL 中获取 "removeFillKey" 参数值,如果没有则默认为空字符串
let removeFillKey = webUtil.httpFn.getQueryString("removeFillKey", "");
if (removeFillKey != "") {
// 如果 "removeFillKey" 参数存在,则设置下拉框 #ddl_removeFillKey 的值
$("#ddl_removeFillKey").val(removeFillKey);
// 根据 "removeFillKey" 的值显示或隐藏自定义填充输入框
onRemoveFillKeyChange();
}
// 从 URL 中获取 "fillPreKey" 参数值,如果没有则默认为空字符串
let fillPreKey = webUtil.httpFn.getQueryString("fillPreKey", "");
// 如果 "fillPreKey" 参数存在,则设置输入框 #txt_fillPreKey 的值
$("#txt_fillPreKey").val(fillPreKey);
// 从 URL 中获取 "fillPostKey" 参数值,如果没有则默认为空字符串
let fillPostKey = webUtil.httpFn.getQueryString("fillPostKey", "");
// 如果 "fillPostKey" 参数存在,则设置输入框 #txt_fillPostKey 的值
$("#txt_fillPostKey").val(fillPostKey);
}
$(function () {
toolPageLoad();
});
</script>
package com.zx.app.work.app.enums.tool;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 编码类型
*/
@AllArgsConstructor
@Getter
public enum EncodeActionEnum {
MD5("md5", "", "", ""),
BASE64("base64", "", "", ""),
AES("aes", "", "DES@", ""),
ENC("enc", "", "ENC(", ")"),
UNKNOWN("unknown", "未知", "", ""),
;
private final String code;
private final String desc;
private final String fillPreKey;
private final String fillPostKey;
public static EncodeActionEnum getItem(String pCode, EncodeActionEnum defaultValue) {
if (pCode == null || pCode.isEmpty()) {
return defaultValue;
}
for (EncodeActionEnum item : EncodeActionEnum.values()) {
if (pCode.equals(item.getCode())) {
return item;
}
}
return defaultValue;
}
/**
* 获得枚举的数据源Key-Value
*
* @return
*/
public static Map getList() {
Map result = new LinkedHashMap();
for (EncodeActionEnum item : EncodeActionEnum.values()) {
result.put(item.getCode(), item.getDesc());
}
return result;
}
protected static String toJson() {
StringBuilder sb = new StringBuilder();
for (EncodeActionEnum em : EncodeActionEnum.values()) {
if(EncodeActionEnum.UNKNOWN.equals(em)){
continue;
}
sb.append("");
}
return sb.toString();
}
public static void main(String[] args) {
String str = toJson();
System.out.println(str);
}
}
package com.zx.app.work.app.enums.tool;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 填充操作
*/
@AllArgsConstructor
@Getter
public enum RemoveFillKeyEnum {
YES("yes", ""),
NO("no", ""),
INPUT("input", ""),
;
private final String code;
/**
* 描述
*/
private final String desc;
public static RemoveFillKeyEnum getItem(String pCode, RemoveFillKeyEnum defaultValue) {
if (pCode == null || pCode.isEmpty()) {
return defaultValue;
}
for (RemoveFillKeyEnum item : RemoveFillKeyEnum.values()) {
if (pCode.equals(item.getCode())) {
return item;
}
}
return defaultValue;
}
}
package com.zx.app.work.app.svc.tool;
import com.zx.app.ba.tool.demo.EncUniUtil;
import com.zx.app.ba.tool.enums.BooleanEnum;
import com.zx.app.ba.tool.util.*;
import com.zx.app.work.app.bs.tool.LoadJenkinsConfigBs;
import com.zx.app.work.app.enums.tool.EncodeActionEnum;
import com.zx.app.work.app.enums.tool.RemoveFillKeyEnum;
import com.zx.app.work.app.item.cp.tool.LoadJenkinsConfigCp;
import com.zx.app.work.app.item.cp.tool.ToolCommonEncodeCp;
import com.zx.app.work.app.item.cr.tool.LoadJenkinsConfigCr;
import com.zx.app.work.common.constant.ConstantName;
/**
* @author SH.YE
*/
public class AppToolCommonSvc {
protected String getFillPreKey(ToolCommonEncodeCp cp){
EncodeActionEnum encodeActionEnumV = EncodeActionEnum.getItem(cp.getAction(), EncodeActionEnum.UNKNOWN);
RemoveFillKeyEnum keyEnum = RemoveFillKeyEnum.getItem(cp.getRemoveFillKey(),RemoveFillKeyEnum.NO);
switch (keyEnum){
case YES:
return encodeActionEnumV.getFillPreKey();
case INPUT:
return StrUniUtil.strNullToEmpty(cp.getFillPreKey());
case NO:
default:
return "";
}
}
protected String getFillPostKey(ToolCommonEncodeCp cp){
EncodeActionEnum encodeActionEnumV = EncodeActionEnum.getItem(cp.getAction(), EncodeActionEnum.UNKNOWN);
RemoveFillKeyEnum keyEnum = RemoveFillKeyEnum.getItem(cp.getRemoveFillKey(),RemoveFillKeyEnum.NO);
switch (keyEnum){
case YES:
return encodeActionEnumV.getFillPostKey();
case INPUT:
return StrUniUtil.strNullToEmpty(cp.getFillPostKey());
case NO:
default:
return "";
}
}
public String encode(ToolCommonEncodeCp cp) {
EncodeActionEnum encodeActionEnumV = EncodeActionEnum.getItem(cp.getAction(), EncodeActionEnum.UNKNOWN);
boolean trimFlag = BooleanEnum.dataIsTrue(cp.getTrimFlag());
String input = StrUniUtil.strNullToTrimEmpty(cp.getInput(),trimFlag);
boolean decodeFlag = BooleanEnum.dataIsTrue(cp.getDecodeFlag());
String fillPreKey = getFillPreKey(cp);
String fillPostKey = getFillPostKey(cp);
if(decodeFlag) {
input = StrUniUtil.strRemoveStartKey(input, fillPreKey);
input = StrUniUtil.strRemoveEndKey(input, fillPostKey);
}
String result = null;
switch (encodeActionEnumV) {
case MD5:
result = Md5Util.getMD5ByEncodingName(input, cp.getCharsetName());
break;
case BASE64:
if (decodeFlag) {
result = Base64Util.decryptBase64(input);
} else {
result = Base64Util.encryptBase64(input, cp.getCharsetName());
result = StrUniUtil.strNotEmptyFillKey(result,fillPreKey,fillPostKey);
}
break;
case AES:
if (decodeFlag) {
result = AesUtil.decode(input, cp.getSecretKey());
} else {
result = AesUtil.encode(input, cp.getSecretKey(), cp.getCharsetName());
result = StrUniUtil.strNotEmptyFillKey(result,fillPreKey,fillPostKey);
}
break;
case ENC:
if (decodeFlag) {
result = EncUniUtil.decode(input, cp.getSecretKey());
} else {
result = EncUniUtil.encode(input, cp.getSecretKey());
result = StrUniUtil.strNotEmptyFillKey(result,fillPreKey,fillPostKey);
}
break;
case UNKNOWN:
default:
return cp.getAction() + "指令未知";
}
return result;
}
}
package com.zx.app.ba.tool.demo;
import org.jasypt.util.text.BasicTextEncryptor;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
public class EncUniUtil {
public static String encode(String secret, String strPwd) {
BasicTextEncryptor worker = new BasicTextEncryptor();
// application.properties,
// jasypt.encryptor.password 加密盐值
worker.setPassword(strPwd);
return worker.encrypt(secret);
}
public static String decode(String secret) {
return decode(secret, UNI_KEY_PWD);
}
public static String decode(String secret, String strPwd) {
BasicTextEncryptor worker = new BasicTextEncryptor();
// application.properties,
// jasypt.encryptor.password 加密盐值
worker.setPassword(strPwd);
return worker.decrypt(secret);
}
}
package com.zx.app.ba.tool.util;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
public class AesUtil {
private static final String AES = "AES";
private static final String SHA1PRNG = "SHA1PRNG";
private static final String UTF8 = "UTF-8";
/**
* 将二进制转换成16进制
*/
public static String parseByte2HexStr(byte[] buf) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; ++i) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
/**
* 将16进制转换为二进制
*/
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr == null) {
return null;
}
int hexStrLen = hexStr.length();
if (hexStrLen < 1) {
return null;
}
int iLen = hexStrLen / 2;
byte[] result = new byte[iLen];
for (int i = 0; i < iLen; ++i) {
int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
public static String encode(String secret, String strPwd, String charsetName) {
byte[] encryptResult = encrypt(secret, strPwd, charsetName);
String encryptResultStr = parseByte2HexStr(encryptResult);
return encryptResultStr;
}
public static String decode(String secret, String strPwd) {
//解密
byte[] decryptFrom = parseHexStr2Byte(secret);
byte[] decryptResult = decrypt(decryptFrom, strPwd);
return new String(decryptResult);
}
/**
* 加密
*
* @param content 需要加密的内容
* @param password 加密密码
* @param charsetName 编码
*/
private static byte[] encrypt(String content, String password, String charsetName) {
try {
KeyGenerator keyGen = KeyGenerator.getInstance(AES);
SecureRandom secureRandom = SecureRandom.getInstance(SHA1PRNG);
secureRandom.setSeed(password.getBytes());
keyGen.init(128, secureRandom);
SecretKey secretKey = keyGen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, AES);
Cipher cipher = Cipher.getInstance(AES);
if (charsetName == null || charsetName.length() == 0) {
charsetName = UTF8;
}
byte[] byteContent = content.getBytes(charsetName);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(byteContent);
return result;
} catch (Exception e) {
return null;
}
}
/**
* 解密
*/
private static byte[] decrypt(byte[] content, String password) {
try {
KeyGenerator keyGen = KeyGenerator.getInstance(AES);
//防止linux下 随机生成key
SecureRandom secureRandom = SecureRandom.getInstance(SHA1PRNG);
secureRandom.setSeed(password.getBytes());
keyGen.init(128, secureRandom);
SecretKey secretKey = keyGen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, AES);
Cipher cipher = Cipher.getInstance(AES);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception e) {
return null;
}
}
}
package com.zx.app.ba.tool.util;
import java.security.MessageDigest;
/**
* MD5相关的方法
*/
public class Md5Util {
/**
* byte[] 数组转成Md5的字符串
*
* @param b
* @return
*/
private static String byteArrayToHexString(byte b[]) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; ++i) {
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString();
}
/**
* byte 转成字符串
*
* @param b
* @return
*/
private static String byteToHexString(byte b) {
int n = b;
if (n < 0) {
n += 256;
}
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
/**
* 通过编码类型生成MD5
*
* @param origin | 原字符串 | 如:Java编程
* @param charsetName |编码类型 | 如:gb2312
* @return
*/
public static String getMD5ByEncodingName(String origin, String charsetName) {
String resultString = null;
try {
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance("MD5");
if (charsetName == null || charsetName.isEmpty()) {
resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
} else {
resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetName)));
}
} catch (Exception err) {
err.printStackTrace();
}
return resultString;
}
/**
*
*/
private static final String[] hexDigits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d",
"e", "f"};
/**
* 获得中文编码类型(gb2312)的MD5
*
* @param s 要MD5的字符串|如:Java编程
* @return
*/
public static String getGb2312Md5(String s) {
return getMD5ByEncodingName(s, "gb2312");
}
/**
* 获得中文编码类型(gb2312)的MD5
*
* @param s 要MD5的字符串|如:Java编程
* @return
*/
public static String getUtf8Md5(String s) {
return getMD5ByEncodingName(s, "UTF-8");
}
}
package com.zx.app.ba.tool.util;
import java.io.UnsupportedEncodingException;
import java.util.Base64;
/**
* @author SH.YE
*/
public class Base64Util {
/**
* Base64编码
*
* @param str
* @return
*/
public static String getBase64En(String str) {
if (str == null) {
return "";
}
return Base64.getEncoder().encodeToString(str.getBytes());
}
/**
* Base64解码
*
* @param str
* @return
*/
public static String getBase64De(String str) {
if (str == null) {
return "";
}
byte[] decodeBytes = Base64.getDecoder().decode(str);
return new String(decodeBytes);
}
/**
* 给字符串加密
*
* @param text
* @return
*/
public static String encryptBase64(String text) {
if (text == null || text.isEmpty()) {
return "";
}
byte[] textByte = new byte[0];
try {
textByte = text.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String encodedText = Base64.getEncoder().encodeToString(textByte);
return encodedText;
}
/**
* 给字符串加密
*
* @param text
* @return
*/
public static String encryptBase64(String text, String charsetName) {
if (text == null || text.isEmpty()) {
return "";
}
byte[] textByte = new byte[0];
try {
if (charsetName == null || charsetName.isEmpty()) {
charsetName = "utf-8";
}
textByte = text.getBytes(charsetName);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String encodedText = Base64.getEncoder().encodeToString(textByte);
return encodedText;
}
/**
* 将加密后的字符串进行解密
*
* @param encodedText
* @return
*/
public static String decryptBase64(String encodedText) {
if (encodedText == null || encodedText.isEmpty()) {
return "";
}
String text = null;
try {
text = new String(Base64.getDecoder().decode(encodedText), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return text;
}
public static String encodeToString(byte[] src) {
return Base64.getEncoder().encodeToString(src);
}
}
public static String strNullToTrimEmpty(String data, boolean trimFlag) {
if (data == null) {
return "";
}
if (trimFlag) {
return data.trim();
}
return data;
}
public static String strRemoveStartKey(String data, String key) {
if (data == null || data.isEmpty()) {
return "";
}
if (key == null || key.isEmpty()) {
return data;
}
if (!data.startsWith(key)) {
return data;
}
if (data.equals(key)) {
return "";
}
return data.substring(key.length());
}
public static String strRemoveEndKey(String data, String key) {
if (data == null || data.isEmpty()) {
return "";
}
if (key == null || key.isEmpty()) {
return data;
}
if (!data.endsWith(key)) {
return data;
}
if (data.equals(key)) {
return "";
}
return data.substring(0, data.length() - key.length());
}
public static String strNotEmptyFillKey(String data, String preKey, String postKey) {
if (data == null || data.isEmpty()) {
return "";
}
return strNullToEmpty(preKey) + strNullToEmpty(data) + strNullToEmpty(postKey);
}