我在驗證我剛剛創建的簽名時遇到了問題。簽名後,我首先使用Base64將簽名轉換爲文本,然後作爲測試,我想驗證是否可以解碼Base64並驗證簽名。這失敗了。這裏是一些沒有錯誤處理的代碼。Android:DSA簽名 - 簽名並驗證
我有我的密鑰對:
DSAPrivateKey privateKey = (DSAPrivateKey) keyPair.getPrivate();
DSAPublicKey publicKey = (DSAPublicKey) keyPair.getPublic();
現在我籤一些文本,打印記錄輸出 - 這似乎很動聽:
String text = "test";
Signature signer = null;
signer = Signature.getInstance(privateKey.getAlgorithm());
SignedObject signedObject = null;
signedObject = new SignedObject(text, privateKey, signer);
String print_signature = Base64.encodeToString(signedObject.getSignature(), Base64.DEFAULT);
System.out.println("Base64 Signature: " + print_signature);
現在我使用上面創建的SignedObject中的對象驗證簽名和不是Base64。這是成功的:
Signature verifier = null;
verifier = Signature.getInstance(publicKey.getAlgorithm());
boolean b = signedObject.verify(publicKey, verifier));
對於我的應用我只會有簽名者的公證書和Base64編碼字符串,所以我只能用這些參數驗證簽名,因此不能AFAIK使用SignedObject中的對象。我使用了簽名對象:
Signature verifier1 = null;
verifier1 = Signature.getInstance(publicKey.getAlgorithm());
verifier1.initVerify(publicKey);
verifier1.update(text.getBytes()); // sorry I forgot this in original posting
byte[] sig1 = Base64.decode(print_signature, Base64.DEFAULT);
b = verifier1.verify(sig1));
此驗證總是失敗(b = false)。
我已經添加了一個測試,以驗證由BaseObject編碼器之前的signedObject.getSignature()返回的簽名(字節數組),以及Base64解碼之後的簽名sig1(字節數組),以及它們匹配。看來Base64工作正常,所以問題必須與我的verifier1對象(恕我直言)。 – LJB 2012-07-25 10:00:41