认证(代码样例)

> RSAUtil ```java import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.xml.bind.DatatypeConverter; import java.io.IOException; import java.io.InputStream; import java.security.*; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; public class RSAUtil { /** * 创建密钥 * @return [私钥, 公钥] * @throws NoSuchAlgorithmException */ public static String[] makeKeys() throws NoSuchAlgorithmException { KeyPairGenerator kp = KeyPairGenerator.getInstance("RSA"); kp.initialize(1024, new SecureRandom()); KeyPair k = kp.generateKeyPair(); return new String[]{ DatatypeConverter.printBase64Binary(k.getPrivate().getEncoded()), DatatypeConverter.printBase64Binary(k.getPublic().getEncoded()) }; } public static String sign(InputStream data, PrivateKey prk) throws NoSuchAlgorithmException, SignatureException, IOException, InvalidKeyException { Signature signature = Signature.getInstance("SHA1withRSA"); signature.initSign(prk); int i;byte[] bs = new byte[1024]; while((i = data.read(bs)) > -1){ if(i > 0){ signature.update(bs, 0, i); } } return DatatypeConverter.printBase64Binary(signature.sign()); } public static boolean verify(InputStream data, String sign, PublicKey puk) throws NoSuchAlgorithmException, SignatureException, IOException, InvalidKeyException { Signature signature = Signature.getInstance("SHA1withRSA"); signature.initVerify(puk); int i;byte[] bs = new byte[1024]; while((i = data.read(bs)) > -1){ if(i > 0){ signature.update(bs, 0, i); } } return signature.verify(DatatypeConverter.parseBase64Binary(sign)); } public static byte[] decode(InputStream data, PrivateKey prk) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, IOException, BadPaddingException, IllegalBlockSizeException { Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, prk); int i;byte[] bs = new byte[1024]; while((i = data.read(bs)) > -1){ if(i > 0){ cipher.update(bs, 0, i); } } return cipher.doFinal(); } public static byte[] encode(InputStream data, PublicKey puk) throws BadPaddingException, IllegalBlockSizeException, IOException, NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException { Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, puk); int i;byte[] bs = new byte[1024]; while((i = data.read(bs)) > -1){ if(i > 0){ cipher.update(bs, 0, i); } } return cipher.doFinal(); } public static PublicKey reaPuk(String key) throws NoSuchAlgorithmException, InvalidKeySpecException { return KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(DatatypeConverter.parseBase64Binary(key))); } public static PrivateKey reaPrk(String key) throws NoSuchAlgorithmException, InvalidKeySpecException { return KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(DatatypeConverter.parseBase64Binary(key))); } } ``` > 签证 ```java byte[] info = RSAUtil.encode(StringUtils.toStream(appKey + systemCode + requestDate), puk); String sign = RSAUtil.sign(new ByteArrayInputStream(info), prk); String token= DatatypeConverter.printBase64Binary(info) + "." + sign; ``` > 验签 ```java String[] authAndSign = auth.split("\\."); if(RSAUtil.verify(StringUtils.base64ToStream(authAndSign[0]), authAndSign[1], RSAUtil.reaPuk(puk))){ // 签证无误,验证数据是否一致 return (apiKey + systemCode + requestDate).equals(new String(RSAUtil.decode(StringUtils.base64ToStream(authAndSign[0]), RSAUtil.reaPrk(prk)))); } ```