/zdal-datasource/src/main/java/com/alipay/zdal/datasource/resource/security/SecureIdentityLoginModule.java
https://github.com/xie-summer/zdal · Java · 156 lines · 122 code · 19 blank · 15 comment · 12 complexity · 4d96da37605520952da12a6516a18030 MD5 · raw file
- /**
- * Alipay.com Inc.
- * Copyright (c) 2004-2012 All Rights Reserved.
- */
- package com.alipay.zdal.datasource.resource.security;
- import java.math.BigInteger;
- import java.security.InvalidKeyException;
- import java.security.NoSuchAlgorithmException;
- import javax.crypto.BadPaddingException;
- import javax.crypto.Cipher;
- import javax.crypto.IllegalBlockSizeException;
- import javax.crypto.NoSuchPaddingException;
- import javax.crypto.spec.SecretKeySpec;
- /**
- * ¼ÓÃÜÄ£¿é
- *
- * @author liangjie.li
- * @version $Id: SecureIdentityLoginModule.java, v 0.1 2012-8-8 ÏÂÎç5:12:38 liangjie.li Exp $
- */
- public class SecureIdentityLoginModule {
- // dev key
- private static byte[] ENC_KEY_BYTES = "jaas is the way".getBytes();
- // prod key
- private static byte[] ENC_KEY_BYTES_PROD = "gQzLk5tTcGYlQ47GG29xQxfbHIURCheJ".getBytes();
- public static String encode(String secret) throws NoSuchPaddingException,
- NoSuchAlgorithmException, InvalidKeyException,
- BadPaddingException, IllegalBlockSizeException {
- return SecureIdentityLoginModule.encode(null, secret);
- }
- public static String encode(String encKey, String secret) throws InvalidKeyException,
- NoSuchAlgorithmException,
- NoSuchPaddingException,
- IllegalBlockSizeException,
- BadPaddingException {
- byte[] kbytes = SecureIdentityLoginModule.ENC_KEY_BYTES_PROD;
- if (isNotBlank(encKey)) {
- kbytes = encKey.getBytes();
- }
- // ĬÈϲÉÓÃprod key¼ÓÃÜÓë½âÃÜ,ÏßÏ»·¾³»áÒì³£;
- try {
- return initEncode(kbytes, secret);
- } catch (InvalidKeyException e) {
- kbytes = SecureIdentityLoginModule.ENC_KEY_BYTES;
- } catch (NoSuchAlgorithmException e) {
- kbytes = SecureIdentityLoginModule.ENC_KEY_BYTES;
- } catch (NoSuchPaddingException e) {
- kbytes = SecureIdentityLoginModule.ENC_KEY_BYTES;
- } catch (IllegalBlockSizeException e) {
- kbytes = SecureIdentityLoginModule.ENC_KEY_BYTES;
- } catch (BadPaddingException e) {
- kbytes = SecureIdentityLoginModule.ENC_KEY_BYTES;
- }
- return initEncode(kbytes, secret);
- }
- static final String initEncode(byte[] kbytes, String secret) throws NoSuchAlgorithmException,
- NoSuchPaddingException,
- InvalidKeyException,
- IllegalBlockSizeException,
- BadPaddingException {
- SecretKeySpec key = new SecretKeySpec(kbytes, "Blowfish");
- Cipher cipher = Cipher.getInstance("Blowfish");
- cipher.init(Cipher.ENCRYPT_MODE, key);
- byte[] encoding = cipher.doFinal(secret.getBytes());
- BigInteger n = new BigInteger(encoding);
- return n.toString(16);
- }
- public static char[] decode(String secret) throws NoSuchPaddingException,
- NoSuchAlgorithmException, InvalidKeyException,
- BadPaddingException, IllegalBlockSizeException {
- return SecureIdentityLoginModule.decode(null, secret).toCharArray();
- }
- public static String decode(String encKey, String secret) throws NoSuchPaddingException,
- NoSuchAlgorithmException,
- InvalidKeyException,
- BadPaddingException,
- IllegalBlockSizeException {
- byte[] kbytes = SecureIdentityLoginModule.ENC_KEY_BYTES_PROD;
- if (isNotBlank(encKey)) {
- kbytes = encKey.getBytes();
- }
- try {
- return iniDecode(kbytes, secret);
- } catch (InvalidKeyException e) {
- kbytes = SecureIdentityLoginModule.ENC_KEY_BYTES;
- } catch (BadPaddingException e) {
- kbytes = SecureIdentityLoginModule.ENC_KEY_BYTES;
- } catch (IllegalBlockSizeException e) {
- kbytes = SecureIdentityLoginModule.ENC_KEY_BYTES;
- }
- return iniDecode(kbytes, secret);
- }
- static final String iniDecode(byte[] kbytes, String secret) throws NoSuchPaddingException,
- NoSuchAlgorithmException,
- InvalidKeyException,
- BadPaddingException,
- IllegalBlockSizeException {
- SecretKeySpec key = new SecretKeySpec(kbytes, "Blowfish");
- BigInteger n = new BigInteger(secret, 16);
- byte[] encoding = n.toByteArray();
- // SECURITY-344: fix leading zeros
- if (encoding.length % 8 != 0) {
- int length = encoding.length;
- int newLength = ((length / 8) + 1) * 8;
- int pad = newLength - length; //number of leading zeros
- byte[] old = encoding;
- encoding = new byte[newLength];
- for (int i = old.length - 1; i >= 0; i--) {
- encoding[i + pad] = old[i];
- }
- }
- Cipher cipher = Cipher.getInstance("Blowfish");
- cipher.init(Cipher.DECRYPT_MODE, key);
- byte[] decode = cipher.doFinal(encoding);
- return new String(decode);
- }
- static final boolean isNotBlank(String str) {
- return !isBlank(str);
- }
- static final boolean isBlank(String str) {
- int strLen = 0;
- if (str == null || (strLen = str.length()) == 0) {
- return true;
- }
- for (int i = 0; i < strLen; i++) {
- if ((Character.isWhitespace(str.charAt(i)) == false)) {
- return false;
- }
- }
- return true;
- }
- public static void main(String[] args) throws InvalidKeyException, NoSuchPaddingException,
- NoSuchAlgorithmException, BadPaddingException,
- IllegalBlockSizeException {
- // System.out.println(encode("ali88"));
- System.out.println(decode("-19c84bf1dcbecee0917eaefd81d23fbf"));
- }
- }