最近一段時間,我一直在嘗試構建一個 Java 庫來解釋和驗證 NZ Covid Passes。在簽名驗證(程序中稍微重要的部分)之前,我已經讓代碼變得更好或更糟。完整的代碼可以在這里找到,但它仍然很粗糙。
驗證器本身在這里可用,有一個伴隨測驗。Covid 通行證的技術規范在這里。至少有一個相關部分。
在與另一位開發人員合作后,我想我已經將其確定為解釋所提供的公鑰。下面的代碼(洗掉了除錯輸出)。公鑰詳情來自這里
private PublicKey extractPublicKey(PublicKeysDetails publicKeyDetails) throws NoSuchAlgorithmException, InvalidParameterSpecException, InvalidKeySpecException {
byte[] xBytes = Base64.getDecoder().decode(publicKeyDetails.x().replace('-', ' ').replace('_', '/'));
byte[] yBytes = Base64.getDecoder().decode(publicKeyDetails.y().replace('-', ' ').replace('_', '/'));
BigInteger x = new BigInteger(xBytes);
BigInteger y = new BigInteger(yBytes);
ECPoint ecPoint = new ECPoint(x, y);
ECGenParameterSpec parameterSpec = new ECGenParameterSpec("secp256r1");//publicKeyDetails.crv() Should always come from the endpoint as "P-256", java wants to know exactly secp256r1, or NIST P-256
AlgorithmParameters parameters = AlgorithmParameters.getInstance("EC");//publicKeyDetails.kty() Should always come from the endpoint as "EC"
parameters.init(parameterSpec);
ECParameterSpec ecParameters = parameters.getParameterSpec(ECParameterSpec.class);
ECPublicKeySpec pubSpec = new ECPublicKeySpec(ecPoint, ecParameters);
KeyFactory kf = KeyFactory.getInstance("EC");
return kf.generatePublic(pubSpec);
}
該錯誤可能存在于該檔案的其他地方,但此時我很不知道它可能是什么。
請幫我堆疊溢位你我唯一的希望?
uj5u.com熱心網友回復:
幾天來一直在圈子里回答我的問題特別是將位元組處理成大整數。
BigInteger x = new BigInteger(xBytes);
BigInteger y = new BigInteger(yBytes);
本來應該
BigInteger x = new BigInteger(1, xBytes);
BigInteger y = new BigInteger(1, yBytes);
這說明這個數字應該是正數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/389859.html
上一篇:如何驗證或限制用戶輸入字母或數字
