认证(代码样例)
> 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))));
}
```