old mode 100644
new mode 100755
| | |
| | | import com.auth0.jwt.exceptions.JWTVerificationException; |
| | | import com.auth0.jwt.interfaces.Claim; |
| | | import com.auth0.jwt.interfaces.DecodedJWT; |
| | | import com.java110.core.context.ApiDataFlow; |
| | | import com.java110.core.context.DataFlow; |
| | | import com.java110.dto.reportData.ReportDataDto; |
| | | import com.java110.dto.reportData.ReportDataHeaderDto; |
| | | import com.java110.utils.cache.JWTCache; |
| | | import com.java110.utils.cache.MappingCache; |
| | | import com.java110.utils.constant.CommonConstant; |
| | | import com.java110.utils.constant.MappingConstant; |
| | | import com.java110.utils.constant.ResponseConstant; |
| | | import com.java110.utils.exception.NoAuthorityException; |
| | | import com.java110.utils.util.Base64Convert; |
| | | import com.java110.utils.util.StringUtil; |
| | | |
| | | import com.java110.core.context.ApiDataFlow; |
| | | import com.java110.core.context.DataFlow; |
| | | import org.apache.commons.codec.digest.DigestUtils; |
| | | |
| | | import javax.crypto.Cipher; |
| | | import javax.crypto.SecretKeyFactory; |
| | | import javax.crypto.spec.DESKeySpec; |
| | | import javax.crypto.spec.IvParameterSpec; |
| | | import javax.crypto.spec.SecretKeySpec; |
| | | import java.io.ByteArrayInputStream; |
| | | import java.io.ByteArrayOutputStream; |
| | | import java.io.UnsupportedEncodingException; |
| | | import java.security.*; |
| | | import java.security.spec.PKCS8EncodedKeySpec; |
| | | import java.security.spec.X509EncodedKeySpec; |
| | | import java.util.*; |
| | | import java.util.Base64; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | import java.util.UUID; |
| | | |
| | | /** |
| | | * 鉴权工厂类 |
| | |
| | | */ |
| | | public class AuthenticationFactory { |
| | | |
| | | private final static String PASSWD_SALT = "hc@java110"; |
| | | public final static String PASSWD_SALT = "hc@java110"; |
| | | |
| | | public final static String AES_KEY = "whoisyourdaddy!!"; |
| | | /** |
| | | * 偏移变量,固定占8位字节 |
| | | */ |
| | | private final static String IV_PARAMETER = "12345678"; |
| | | /** |
| | | * 密钥算法 |
| | | */ |
| | | private static final String ALGORITHM = "DES"; |
| | | /** |
| | | * 加密/解密算法-工作模式-填充模式 |
| | | */ |
| | | private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding"; |
| | | /** |
| | | * 默认编码 |
| | | */ |
| | | private static final String CHARSET = "utf-8"; |
| | | |
| | | |
| | | // 加密 |
| | | public static String AesEncrypt(String sSrc, String sKey) { |
| | | try { |
| | | if (sKey == null) { |
| | | System.out.print("Key为空null"); |
| | | return null; |
| | | } |
| | | // 判断Key是否为16位 |
| | | // if (sKey.length() != 16) { |
| | | // System.out.print("Key长度不是16位"); |
| | | // return null; |
| | | // } |
| | | byte[] raw = sKey.getBytes("utf-8"); |
| | | SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); |
| | | Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式" |
| | | cipher.init(Cipher.ENCRYPT_MODE, skeySpec); |
| | | byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8")); |
| | | |
| | | return Base64Convert.byteToBase64(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。 |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return ""; |
| | | } |
| | | |
| | | // 解密 |
| | | public static String AesDecrypt(String sSrc, String sKey) { |
| | | try { |
| | | // 判断Key是否正确 |
| | | if (sKey == null) { |
| | | System.out.print("Key为空null"); |
| | | return null; |
| | | } |
| | | // 判断Key是否为16位 |
| | | // if (sKey.length() != 16) { |
| | | // System.out.print("Key长度不是16位"); |
| | | // return null; |
| | | // } |
| | | byte[] raw = sKey.getBytes("utf-8"); |
| | | SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); |
| | | Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); |
| | | cipher.init(Cipher.DECRYPT_MODE, skeySpec); |
| | | byte[] encrypted1 = Base64Convert.base64ToByte(sSrc);//先用base64解密 |
| | | try { |
| | | byte[] original = cipher.doFinal(encrypted1); |
| | | String originalString = new String(original, "utf-8"); |
| | | return originalString; |
| | | } catch (Exception e) { |
| | | System.out.println(e.toString()); |
| | | return null; |
| | | } |
| | | } catch (Exception ex) { |
| | | System.out.println(ex.toString()); |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 生成key |
| | | * |
| | | * @param password |
| | | * @return |
| | | * @throws Exception |
| | | */ |
| | | private static Key generateKey(String password) throws Exception { |
| | | DESKeySpec dks = new DESKeySpec(password.getBytes(CHARSET)); |
| | | SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); |
| | | return keyFactory.generateSecret(dks); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * DES加密字符串 |
| | | * |
| | | * @param password 加密密码,长度不能够小于8位 |
| | | * @param data 待加密字符串 |
| | | * @return 加密后内容 |
| | | */ |
| | | public static String encrypt(String password, String data) { |
| | | if (password == null || password.length() < 8) { |
| | | throw new RuntimeException("加密失败,key不能小于8位"); |
| | | } |
| | | if (data == null) |
| | | return null; |
| | | try { |
| | | Key secretKey = generateKey(password); |
| | | Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); |
| | | IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); |
| | | cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); |
| | | byte[] bytes = cipher.doFinal(data.getBytes(CHARSET)); |
| | | |
| | | //JDK1.8及以上可直接使用Base64,JDK1.7及以下可以使用BASE64Encoder |
| | | //Android平台可以使用android.util.Base64 |
| | | return new String(Base64.getEncoder().encode(bytes)); |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | return data; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * DES解密字符串 |
| | | * |
| | | * @param password 解密密码,长度不能够小于8位 |
| | | * @param data 待解密字符串 |
| | | * @return 解密后内容 |
| | | */ |
| | | public static String decrypt(String password, String data) { |
| | | if (password == null || password.length() < 8) { |
| | | throw new RuntimeException("加密失败,key不能小于8位"); |
| | | } |
| | | if (data == null) |
| | | return null; |
| | | try { |
| | | Key secretKey = generateKey(password); |
| | | Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); |
| | | IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); |
| | | cipher.init(Cipher.DECRYPT_MODE, secretKey, iv); |
| | | return new String(cipher.doFinal(Base64.getDecoder().decode(data.getBytes(CHARSET))), CHARSET); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | return data; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 用户密码 md5签名 |
| | |
| | | return md5(reqInfo); |
| | | } |
| | | |
| | | public static String SHA1Encode(String sourceString) { |
| | | String resultString = null; |
| | | try { |
| | | resultString = new String(sourceString); |
| | | MessageDigest md = MessageDigest.getInstance("SHA-1"); |
| | | resultString = byte2hexString(md.digest(resultString.getBytes())); |
| | | } catch (Exception localException) { |
| | | } |
| | | return resultString; |
| | | } |
| | | |
| | | |
| | | public static final String byte2hexString(byte[] bytes) { |
| | | StringBuffer buf = new StringBuffer(bytes.length * 2); |
| | | for (int i = 0; i < bytes.length; i++) { |
| | | if ((bytes[i] & 0xFF) < 16) { |
| | | buf.append("0"); |
| | | } |
| | | buf.append(Long.toString(bytes[i] & 0xFF, 16)); |
| | | } |
| | | return buf.toString().toUpperCase(); |
| | | } |
| | | |
| | | /** |
| | | * dataFlow 对象签名 |
| | | * |
| | |
| | | throw new NoAuthorityException(ResponseConstant.RESULT_CODE_NO_AUTHORITY_ERROR, "MD5签名过程中出现错误"); |
| | | } |
| | | String reqInfo = dataFlow.getTransactionId() + dataFlow.getRequestTime() + dataFlow.getAppId(); |
| | | String url = dataFlow.getRequestHeaders().get("REQUEST_URL"); |
| | | String param = ""; |
| | | if (url.indexOf("?") > 0) { |
| | | param = url.substring(url.indexOf("?")); |
| | | } |
| | | //,DELETE |
| | | reqInfo += "GET".equals(dataFlow.getRequestHeaders().get(CommonConstant.HTTP_METHOD)) ? |
| | | dataFlow.getRequestHeaders().get("REQUEST_URL") : dataFlow.getReqData(); |
| | | param : dataFlow.getReqData(); |
| | | reqInfo += dataFlow.getAppRoutes().get(0).getSecurityCode(); |
| | | return md5(reqInfo); |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * md5签名 |
| | | * |
| | | * @param reportDataDto |
| | | * @return |
| | | */ |
| | | public static void authReportDataSign(ReportDataDto reportDataDto, String code) throws NoAuthorityException { |
| | | ReportDataHeaderDto reportDataHeaderDto = reportDataDto.getReportDataHeaderDto(); |
| | | if (reportDataHeaderDto == null) { |
| | | throw new IllegalArgumentException("参数错误"); |
| | | } |
| | | String newSign = md5(reportDataHeaderDto.getTranId() + reportDataHeaderDto.getReqTime() + reportDataDto.getReportDataBodyDto().toJSONString() + code).toLowerCase(); |
| | | if (!newSign.equals(reportDataHeaderDto.getSign())) { |
| | | throw new IllegalArgumentException("签名失败"); |
| | | } |
| | | } |
| | | |
| | | public static void generatorReportDataSign(ReportDataDto reportDataDto, String code) { |
| | | ReportDataHeaderDto reportDataHeaderDto = reportDataDto.getReportDataHeaderDto(); |
| | | if (reportDataHeaderDto == null) { |
| | | throw new IllegalArgumentException("参数错误"); |
| | | } |
| | | String newSign = md5(reportDataHeaderDto.getTranId() + reportDataHeaderDto.getReqTime() + reportDataDto.getReportDataBodyDto().toJSONString() + code).toLowerCase(); |
| | | reportDataHeaderDto.setSign(newSign); |
| | | } |
| | | |
| | | /** |
| | | * 加载公钥 |
| | | * |
| | | * @param publicPemData |
| | |
| | | |
| | | /***********************************JWT end***************************************/ |
| | | public static void main(String[] args) throws Exception { |
| | | KeyPair keyPair = genKeyPair(1024); |
| | | // KeyPair keyPair = genKeyPair(1024); |
| | | // |
| | | // //获取公钥,并以base64格式打印出来 |
| | | // PublicKey publicKey = keyPair.getPublic(); |
| | | // System.out.println("公钥:" + new String(Base64.getEncoder().encode(publicKey.getEncoded()))); |
| | | // |
| | | // //获取私钥,并以base64格式打印出来 |
| | | // PrivateKey privateKey = keyPair.getPrivate(); |
| | | // System.out.println("私钥:" + new String(Base64.getEncoder().encode(privateKey.getEncoded()))); |
| | | |
| | | //获取公钥,并以base64格式打印出来 |
| | | PublicKey publicKey = keyPair.getPublic(); |
| | | System.out.println("公钥:" + new String(Base64.getEncoder().encode(publicKey.getEncoded()))); |
| | | |
| | | //获取私钥,并以base64格式打印出来 |
| | | PrivateKey privateKey = keyPair.getPrivate(); |
| | | System.out.println("私钥:" + new String(Base64.getEncoder().encode(privateKey.getEncoded()))); |
| | | System.out.printf("passwdMd5 " + passwdMd5("397301")); |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | |