>

swift 4에서 JWT를 구현하려고 할 때 문제가 있습니다. jwt.io의 JWT 라이브러리를 사용합니다. PKCS8 pem 파일 형식 및 RSA256 알고리즘 인증서로 페이로드를 암호화하려고합니다. "항상 작업을 완료 할 수 없습니다. (OSStatus 오류 -50-데이터에서 RSA 개인 키를 만들지 못했습니다)"메시지와 함께 오류가 발생했습니다.

다른 사람이 도와 줄 수 있나요?

코드 :

let payload: [AnyHashable:Any] = ["payload":"hiden_information"]
let algorithmName = "RS256"
let path = Bundle.main.path(forResource: "priv", ofType: "pem")
let privateKeySecretData = try? Data(contentsOf: URL(fileURLWithPath: path!))
let privateKey = String(data: privateKeySecretData!, encoding: .utf8)!
let signDataHolder: JWTAlgorithmRSFamilyDataHolder =  JWTAlgorithmRSFamilyDataHolder()
 _ = signDataHolder.keyExtractorType(JWTCryptoKeyExtractor.privateKeyWithPEMBase64().type)
_ = signDataHolder.algorithmName(algorithmName)
_ = signDataHolder.secret(privateKey)
let signBuilder : JWTEncodingBuilder = JWTEncodingBuilder.encodePayload(payload)
_ = signBuilder.addHolder(signDataHolder)
let signResult = signBuilder.result
        if ((signResult?.successResult) != nil) {
            print(signResult!.successResult.encoded)
        } else {
            print(signResult?.errorResult.error.localizedDescription ?? "Unknown")
        }

  • 답변 # 1

    JWT 버전 3.0.0.- 베타 7은 PKCS8을 지원하지 않았다. RSA256과 함께 PKCS1을 사용했는데 제대로 작동했습니다!

    func encryptPayload(payload:[AnyHashable:Any])->String?
    {
        var resultStr: String?
        var publicKeyCrypto: JWTCryptoKeyProtocol? = nil
        do {
            publicKeyCrypto = try JWTCryptoKeyPublic(pemEncoded: AppConstant.Scurity.publicKey, parameters: nil)
        }
        catch {
            NSLog("error: \(error)")
        }
        guard let theCrypto = publicKeyCrypto else {
            return nil
        }
        do {
            let privateKeyCrypto = try JWTCryptoKeyPrivate(pemEncoded: privateKey, parameters: nil)
            guard let holder = JWTAlgorithmRSFamilyDataHolder().signKey(privateKeyCrypto)?.secretData(AppConstant.Scurity.privateKey.data(using: .utf8))?.algorithmName(JWTAlgorithmNameRS256) else {return nil}
            let headers : [AnyHashable:Any] = ["alg": "RS256","typ": "JWT"]
            guard let encoding = JWTEncodingBuilder.encodePayload(payload).headers(headers)?.addHolder(holder) else {return nil}
            let result = encoding.result
            print(result?.successResult?.encoded ?? "Encoding failed")
            print(result?.errorResult?.error ?? "No encoding error")
            let verifyDataHolder = JWTAlgorithmRSFamilyDataHolder().signKey(theCrypto)?.secretData(publicKey.data(using: .utf8)!)?.algorithmName(JWTAlgorithmNameRS256)
            let verifyResult = JWTDecodingBuilder.decodeMessage(result?.successResult?.encoded).addHolder(verifyDataHolder)?.result
            if verifyResult?.successResult != nil, let result = verifyResult?.successResult.encoded {
                print("Verification successful, result: \(result)")
            } else {
                print("Verification error: \(verifyResult!.errorResult.error)")
            }
            resultStr = result?.successResult.encoded
        } catch {
            print(error)
        }
        return resultStr
    }
    
    

  • 이전 ceil - 파이썬 - 십진수 반올림
  • 다음 cuda - 호환되지 않는 nvml 라이브러리가 포함 된 경우 nvidia-smi가 실패합니다