我正在使用SpongCastle Provider v1.51。基于答案here from StackOverflow我添加以下Maven到我的项目,该项目如下(只相关SpongyCastle)SpongyCastle Provider加载SHA1withRSA算法,但仍然不可用
,已具备加入SpongyCastle PGP到maven pom
文件。
我仍在测试调试功能,并且没有使用任何Proguard
功能,无论如何。
的pom.xml
<dependency>
<groupId>com.madgag.spongycastle</groupId>
<artifactId>core</artifactId>
<version>1.51.0.0</version>
</dependency>
<dependency>
<groupId>com.madgag.spongycastle</groupId>
<artifactId>prov</artifactId>
<version>1.51.0.0</version>
</dependency>
<dependency>
<groupId>com.madgag.spongycastle</groupId>
<artifactId>pg</artifactId>
<version>1.51.0.0</version>
</dependency>
以下为签署
private Document sign(Document document, boolean paramBoolean)throws Exception{
if (System.getenv("SKIP_DIGITAL_SIGNATURE") != null) {
return document;
}
X509Certificate x509Certificate = (X509Certificate)this.ks.getCertificate(this.alias);
Logger.d(TAG, "document base uri "+document.getBaseURI());
if(!Init.isInitialized()){
Logger.d(TAG, "initialzing the Init");
Init.init();
}else{
Logger.d(TAG, "already initialzed");
}
// Logger.d(TAG, ""+localX509Certificate.get);
XMLSignature localXMLSignature = new XMLSignature(document,"", XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1);
document.getDocumentElement().appendChild(localXMLSignature.getElement());
Transforms localTransforms = new Transforms(document);
localTransforms.addTransform("http://www.w3.org/2000/09/xmldsig#enveloped-signature");
localXMLSignature.addDocument("", localTransforms, XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1);
X509Data localX509Data = new X509Data(document);
localXMLSignature.getKeyInfo().add(localX509Data);
localX509Data.addSubjectName(x509Certificate.getSubjectX500Principal().getName());
localX509Data.addCertificate(x509Certificate);
localXMLSignature.sign(this.privateKey);
return document;
}
public String signXML(String paramString, boolean paramBoolean)
{
/* BouncyCastleProvider provider=new BouncyCastleProvider();
Set<Service>service=provider.getServices();
PKCSObjectIdentifiers.sha1WithRSAEncryption
Security.addProvider(new BouncyCastleProvider());
Iterator<Service> itr=service.iterator();
while(itr.hasNext()){
Service ser=itr.next();
ser.
}*/
//added spongycastle provider here
Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider());
// new org.spongycastle.jce.provider.BouncyCastleProvider().
// Security.addProvider(new);
try
{
DocumentBuilderFactory localDocumentBuilderFactory = DocumentBuilderFactory.newInstance();
localDocumentBuilderFactory.setNamespaceAware(true);
Document localDocument = sign(localDocumentBuilderFactory.newDocumentBuilder().parse(new InputSource(new StringReader(paramString))), paramBoolean);
StringWriter localStringWriter = new StringWriter();
TransformerFactory.newInstance().newTransformer().transform(new DOMSource(localDocument), new StreamResult(localStringWriter));
String str = localStringWriter.getBuffer().toString();
return str;
}
catch (Exception localException)
{
localException.printStackTrace();
throw new RuntimeException("Error while digitally signing the XML document", localException);
}
}
日志堆栈跟踪
05-04 11:26:34.716: W/dalvikvm(10319): dvmFindClassByName rejecting 'org/apache/xml/security/resource/xmlsecurity_en_US'
05-04 11:26:34.716: W/dalvikvm(10319): dvmFindClassByName rejecting 'org/apache/xml/security/resource/xmlsecurity_en'
05-04 11:26:34.746: W/dalvikvm(10319): dvmFindClassByName rejecting 'org/apache/xml/security/resource/xmlsecurity'
05-04 11:26:34.846: W/System.err(10319): org.apache.xml.security.signature.XMLSignatureException: The requested algorithm SHA1withRSA does not exist. Original Message was: MessageDigest SHA1withRSA implementation not found
05-04 11:26:34.846: W/System.err(10319): at org.apache.xml.security.algorithms.MessageDigestAlgorithm.getInstance(Unknown Source)
05-04 11:26:34.846: W/System.err(10319): at org.apache.xml.security.signature.Reference.<init>(Unknown Source)
05-04 11:26:34.846: W/System.err(10319): at org.apache.xml.security.signature.Manifest.addDocument(Unknown Source)
05-04 11:26:34.846: W/System.err(10319): at org.apache.xml.security.signature.XMLSignature.addDocument(Unknown Source)
05-04 11:26:34.846: W/System.err(10319): at com.companyname.project.auth.helper.DigitalSigner.sign(DigitalSigner.java:78)
05-04 11:26:34.846: W/System.err(10319): at com.companyname.project.auth.helper.DigitalSigner.signXML(DigitalSigner.java:106)
05-04 11:26:34.846: W/System.err(10319): at com.companyname.project.auth.client.AuthClient.authenticate(AuthClient.java:50)
05-04 11:26:34.846: W/System.err(10319): at com.companyname.project.auth.client.AuthRequest.authenticateRequest(AuthRequest.java:138)
05-04 11:26:34.856: W/System.err(10319): at com.companyname.project.activity.MainActivity$AuthenticateResultAsyncTask.doInBackground(MainActivity.java:163)
05-04 11:26:34.856: W/System.err(10319): at com.companyname.project.activity.MainActivity$AuthenticateResultAsyncTask.doInBackground(MainActivity.java:132)
05-04 11:26:34.856: W/System.err(10319): at android.os.AsyncTask$2.call(AsyncTask.java:264)
05-04 11:26:34.856: W/System.err(10319): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-04 11:26:34.856: W/System.err(10319): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-04 11:26:34.856: W/System.err(10319): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
05-04 11:26:34.856: W/System.err(10319): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-04 11:26:34.856: W/System.err(10319): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
05-04 11:26:34.856: W/System.err(10319): at java.lang.Thread.run(Thread.java:856)
05-04 11:26:34.856: W/System.err(10319): java.lang.RuntimeException: Error while digitally signing the XML document
05-04 11:26:34.866: W/System.err(10319): at com.companyname.project.auth.helper.DigitalSigner.signXML(DigitalSigner.java:115)
05-04 11:26:34.866: W/System.err(10319): at com.companyname.project.auth.client.AuthClient.authenticate(AuthClient.java:50)
05-04 11:26:34.876: W/System.err(10319): at com.companyname.project.auth.client.AuthRequest.authenticateRequest(AuthRequest.java:138)
05-04 11:26:34.876: W/System.err(10319): at com.companyname.project.activity.MainActivity$AuthenticateResultAsyncTask.doInBackground(MainActivity.java:163)
05-04 11:26:34.876: W/System.err(10319): at com.companyname.project.activity.MainActivity$AuthenticateResultAsyncTask.doInBackground(MainActivity.java:132)
05-04 11:26:34.876: W/System.err(10319): at android.os.AsyncTask$2.call(AsyncTask.java:264)
05-04 11:26:34.876: W/System.err(10319): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-04 11:26:34.876: W/System.err(10319): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-04 11:26:34.876: W/System.err(10319): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
05-04 11:26:34.876: W/System.err(10319): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-04 11:26:34.876: W/System.err(10319): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
05-04 11:26:34.876: W/System.err(10319): at java.lang.Thread.run(Thread.java:856)
Q.1为什么它的代码SHA1WithRSA
ALGOR ithm不可用,即使在SpongyCastle
加载该算法后?
Q.2为什么在世界上的Android不支持类加载,因为它是使用.class
,这是通过使用Java的JAXB(我想马歇尔/包的XML和数字签名)。它将我的开发时间从几天增加到几周。
Poor android does not support XML that good.
请随时要求进一步澄清。感谢您的时间。
UPDATE:
我加入了以下从这里的代码,以获得算法的列表
Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider());
// new org.spongycastle.jce.provider.BouncyCastleProvider().
// Security.addProvider(new);
for (Provider provider : Security.getProviders()) {
System.out.println("Provider: " + provider.getName());
for (Provider.Service service : provider.getServices()) {
System.out.println(" Algorithm: " + service.getAlgorithm());
}
}
输出的算法(不完整,只有特定的)的列表
05-04 12:13:48.145: I/System.out(22193): Algorithm: DETECDSA
05-04 12:13:48.145: I/System.out(22193): Algorithm: SEED-GMAC
05-04 12:13:48.145: I/System.out(22193): Algorithm: RC5
05-04 12:13:48.145: I/System.out(22193): Algorithm: CERTIFICATE
05-04 12:13:48.145: I/System.out(22193): Algorithm: POLY1305-CAMELLIA
05-04 12:13:48.145: I/System.out(22193): Algorithm: HC256
05-04 12:13:48.145: I/System.out(22193): Algorithm: VMPC-KSA3
05-04 12:13:48.145: I/System.out(22193): Algorithm: DESMAC64
05-04 12:13:48.145: I/System.out(22193): Algorithm: SHA1WITHRSA
05-04 12:13:48.145: I/System.out(22193): Algorithm: BouncyCastle
05-04 12:13:48.145: I/System.out(22193): Algorithm: SKIPJACK
05-04 12:13:48.145: I/System.out(22193): Algorithm: DESEDEMAC
05-04 12:13:48.155: I/System.out(22193): Algorithm: POLY1305-CAMELLIA
05-04 12:13:48.155: I/System.out(22193): Algorithm: SHA3-224
05-04 12:13:48.155: I/System.out(22193): Algorithm: Skein-512-384
即使加载后算法也不可用。
不知道是什么问题,我啰嗦了发送对象属性的服务器,其中i马歇尔成XML,然后签字关于java服务器端,它在哪里工作得很漂亮。 P.s在那里不使用海绵堡垒 –