【问题标题】:RSA Sign on iOS (Swift) and Verify in JavaRSA 在 iOS (Swift) 上签名并在 Java 中验证
【发布时间】: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


【解决方案1】:

我解决了这个问题,我删除了消息的初始设置(在 iOS 上)。然后一切正常。 Heimdall.sign 在签名之前已经对数据进行了哈希处理。

【讨论】:

    猜你喜欢
    • 2016-01-15
    • 2014-03-10
    • 2017-07-30
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多