本文介紹了RSA登錄IOS(SWIFT)并在Java中驗證的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我在iOS上簽名數據并在Java中驗證數據時遇到問題。
到目前為止我嘗試的內容:
iOS(SWIFT):
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 ]
我正在使用SWIFTHeimdall處理RSA-Key,報文以JSON格式通過http發送。
在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 );
但結果始終為假:-/
據我所知,數據傳輸是正確的。
也許我在擺弄編碼。
推薦答案
我解決了問題,刪除了消息的初始設置(在iOS上)。那么一切都很好。Heimdall.sign正在對數據進行哈希處理,然后再進行簽名。
這篇關于RSA登錄IOS(SWIFT)并在Java中驗證的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,