Spring Security Custom Login (II)
在上一章節我們已經將原先的登入方式改為自訂方式,那麼接下來就是新增使用者了,那麼新增使用者這部分我會使用jsencrypt進行加密,這一套前端加密方法是使用常見的public、private這種方式,這也算是目前我認為比較可行的使用方式,畢竟效能是有所影響的,再者前端加密意義其實也不大,但這種方式確實可以讓安全再次提升。
JKS
keytool -genkey -v -alias test -keyalg RSA -keystore test.jks
JKS To PKCS12
keytool -importkeystore -srckeystore test.jks -destkeystore test.p12 -srcstoretype JKS -deststoretype PKCS12
PKCS12 To OpenSSL Key
openssl pkcs12 -in test.p12 -out test.key
Get Public Key
openssl rsa -in test.key -pubout -out test_public.pem
上述都做完後,我們會拿到一組名稱為test_public.pem的key,可以直接用記事本開啟即可,就是我們給前端使用的key。
Encoder
於jsencrypt中使用Encoder非常簡單,只要把公鑰與要加密的資料傳入,利用encrypt方法即可取得加密後的編碼,在到後端進行解密。
function encoder(data, publicKey){
var jsencrypt = new JSEncrypt();
jsencrypt.setPublicKey(publicKey);
var result = new Object();
for(var key in data){
result[key] = jsencrypt.encrypt(data[key]);
}
}
Decoder
前端已經加密了,那麼後端則需要解密,解密後,看資料需求,後端會再做一次加密,如密碼可以做Hash + Salt方式進行,
public String decoder(String arg0) {
byte[] bs = null;
try {
BASE64Decoder decoder = new BASE64Decoder();
bs = decoder.decodeBuffer(arg0);
} catch (Exception e) {
e.printStackTrace();
}
KeyStore keyStore = null;
try {
keyStore = KeyStore.getInstance("JKS");
keyStore.load(new FileInputStream("D:/jsencrypt/test.jks"), "123456".toCharArray());
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, keyStore.getKey("test", "123456".toCharArray()));
logger.info(new String(cipher.doFinal(bs)));
} catch (Exception e) {
e.printStackTrace();
}
}