2015/3/31

linux、windows、andorid使用JAVA的AES



提示:如果你用properties,請記得linux跟windows的換行.......

原理:
每個都要有一個KEY,把字串(密碼)用sha-256 來Hash之後,當作KEY
然後加解密

參考:http://magiclen.org/aes/
public static String DataENCryptDECryptProcess(int ENDNMode, String messages, String keyString)
{
String ALGORITHM = "AES";
String TRANSFORMATION = "AES/CBC/PKCS5Padding";
Cipher cipher;
String IvString = "1234567890ABCDEF";
IvParameterSpec DEFAULT_IV = new IvParameterSpec(IvString.getBytes("UTF-8"));

byte[] data=keyString.getBytes("UTF-8");
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(data);
byte[] keyBytes = new byte[32];
System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);
Skeyspec = new SecretKeySpec(keyBytes, ALGORITHM);
cipher = Cipher.getInstance(TRANSFORMATION);

switch (ENDNMode) {
    case ENCRYPT:
       decryptFrom = messages.getBytes("UTF-8");
       cipher.init(Cipher.ENCRYPT_MODE, Skeyspec,DEFAULT_IV);
       result = cipher.doFinal(decryptFrom);
     return new String(alonaBase64.getEncoder().encode(result),"UTF-8");
     case DECRYPT:
       decryptFrom = alonaBase64.getDecoder().decode(messages);
       cipher.init(Cipher.DECRYPT_MODE, Skeyspec,DEFAULT_IV);
       result = cipher.doFinal(decryptFrom);
    return new String(result, "UTF-8");
    default:
    return "ERROR";
}
}

找過另外一種解法,但是在windows與LINUX上面搭配有問題的解法:
經過測試,還是沒辦法解決win與linux上的KEY不同
原因: SecureRandom 實現完全隨操作系統本身的內部狀態,除非調用方在調用 getInstance 方法之後又調用了 setSeed 方法;該實現在 windows 上每次生成的 key 都相同,但是在 solaris 或部分 linux 系統上則不同。
if (detectPlatform("Android")) {
    secureRandom = SecureRandom.getInstance("SHA1PRNG", "Crypto");
} else {
    System.out.println("iswindows=" + detectPlatform("windows"));
    System.out.println("isLinux=" + detectPlatform("linux"));
    secureRandom = SecureRandom.getInstance("SHA1PRNG");
}   
    secureRandom.setSeed(keyString.getBytes("UTF-8"));
    kgen.init(keysize,secureRandom);
    SecretKey secretKey = kgen.generateKey();
    byte[] enCodeFormat = secretKey.getEncoded();
    System.out.println("enCodeFormat="+parseByte2HexStr(enCodeFormat));
    Skeyspec = new SecretKeySpec(enCodeFormat, ALGORITHM);

JPA+complex key+custom Query

  來源: https://www.cnblogs.com/520playboy/p/6512592.html   整個來說,就是有複合主鍵 然後要使用  public interface XxXXxx DAO extends CrudRepository<Tc...