【发布时间】:2015-12-14 18:27:28
【问题描述】:
我在 iOS 上签署数据并在 Java 中验证数据时遇到问题。
到目前为止我尝试了什么:
iOS(斯威夫特):
let text = "Hello World!"
let publicKey = heimdall.publicKeyComponents()!
let hashedText = text.sha512()
let modulus = publicKey.modulus.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
let exponent = publicKey.exponent.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
let signature = heimdall.sign(hashedText.dataUsingEncoding(NSUTF8StringEncoding)!)!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
let verSig = NSData(base64EncodedString: signature, options: NSDataBase64DecodingOptions(rawValue: 0))
let message: NSDictionary = ["text": text, "signature": signature, "modulus": modulus, "exponent": exponent ]
我正在使用 Swift Heimdall 进行 RSA-Key 处理,消息通过 http 作为 JSON 发送。
在 Java 端:
final byte[] signature = Base64.decodeBase64( message.getSignature() );
final byte[] modulus = Base64.decodeBase64( message.getModulus() ) ;
final byte[] exponent = Base64.decodeBase64( message.getExponent() );
final String messageText = message.getText();
final Signature sig = Signature.getInstance( "SHA512withRSA" );
final KeyFactory keyMaker = KeyFactory.getInstance( "RSA" );
final RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec( new BigInteger( modulus ),
new BigInteger( exponent ) );
final RSAPublicKey pubKey = (RSAPublicKey)keyMaker.generatePublic( pubKeySpec );
sig.initVerify( pubKey );
sig.update( messageText.getBytes() );
final boolean result = sig.verify( signature );
但结果总是错误的 :-/ 据我所见,数据已正确传输。 也许我在搞乱编码。
【问题讨论】:
-
您实际上想要完成什么?您几乎可以肯定不应该使用原始 RSA。
-
如上所述,我喜欢验证从 iOS 发送的 Java 消息。我还认为 Point RAW RSA 散列和签名会很好,为什么不呢?
-
只使用 TLS。为您解决了这个确切的问题,除非它是正确的。
-
SSL(通过 https)用于传输,但每条消息都需要签名,这是要求,因为需要存储此信息(消息 + 签名)。如果我可以用 SSL 归档这个,我会很高兴知道如何。
-
通过 tls 共享秘密并使用 hmac。通常,避免使用自己的加密货币
标签: java ios swift rsa digital-signature