public class SignUtils {
private static final String ALGORITHM = "RSA";
private static final String SIGN_ALGORITHMS = "SHA1WithRSA";
private static final String DEFAULT_CHARSET = "UTF-8";
public static String sign(String content, String privateKey) {
try {
PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(
Base64.decode(privateKey));
KeyFactory keyf = KeyFactory.getInstance(ALGORITHM);
PrivateKey priKey = keyf.generatePrivate(priPKCS8);
java.security.Signature signature = java.security.Signature
.getInstance(SIGN_ALGORITHMS);
signature.initSign(priKey);
signature.update(content.getBytes(DEFAULT_CHARSET));
byte[] signed = signature.sign();
return Base64.encode(signed);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
第一开始,调用KeyFactory keyf = KeyFactory.getInstance(ALGORITHM);报错。如下:
java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
KeyFactory keyf = KeyFactory.getInstance(ALGORITHM, "BC"); 加入了“BC”报如下错误:
com.android.org.bouncycastle.jcajce.provider.asymmetric.util.ExtendedInvalidKeySpecException: unable to process key spec: java.lang.ClassCastException: com.android.org.bouncycastle.asn1.DLSequence cannot be cast to com.android.org.bouncycastle.asn1.ASN1Integer
最终因为传入私钥错误。需要重新生成私钥:
私钥的格式大约是这样:
记录下支付宝开发过程。想说的是,网上的文档真的是层出不穷。但是由于版本升级问题。所以很多网上的文档描述其实是错误的。记录下。开发过程中遇到的一些小问题。
1.开发流程图就不记录了。直接上一个链接。 http://blog.it985.com/12276.html 这个就可以了。写的很详细
2.遇到的问题,无法执行。解决办法:工具类SignUtils 里面的KeyFactory keyf = KeyFactory.getInstance(ALGORITHM);改为KeyFactory keyf = KeyFactory.getInstance(ALGORITHM,"BC"); 至于为什么。可以百度下公钥私钥加密相关文档。
3.空指针问题。 这个绝对是私钥出错了。私钥如何来?私钥一定不要用开发工具在dos下生成的位于bin目录下的pem那个文件。因为那个是并没有将RSA私钥转换成PKCS8格式。所以我们的私钥,需要的是cmd里面的那一串。超级长的什么鬼。
4.以上是遇到的两个小问题。昨晚百度一夜。发现基本都是这两个问题。但是解决办法都不一。记录下。为以后开发少走弯路。