Kann ich das Modul oder exponent aus einer SecKeyRef Objekt in Swift?
In Swift habe ich eine SecKeyRef
- Objekt durch Aufruf SecTrustCopyPublicKey
auf einige raw-X509-Zertifikat-Daten. Dies ist, was diese SecKeyRef
Objekt aussieht.
Optional(<SecKeyRef algorithm id: 1,
key type: RSAPublicKey,
version: 3, block size: 2048 bits,
exponent: {hex: 10001, decimal: 65537},
modulus: <omitted a bunch of hex data>,
addr: 0xsomeaddresshere>)
Grundsätzlich SecKeyRef
- Objekt enthält eine ganze Reihe von Informationen über den öffentlichen Schlüssel, aber es scheint kein Weg, um tatsächlich zu konvertieren SecKeyRef
in einen string NSData
oder sonst etwas (das ist mein Ziel, ist, nur um eine base64-public-key).
Allerdings habe ich eine Funktion, die ich geben kann modulus
und ein exponent
, und es wird nur berechnet, was der öffentliche Schlüssel ist. Ich habe es getestet, indem in den Daten protokolliert, die von den oben SecKeyRef
.
Aber irgendwie kann ich keinen Zugriff auf diese Eigenschaften vom SecKeyRef
Objekt (ich kann nur sehen, wie das ganze Objekt in die Konsole; ich kann zum Beispiel nicht tun SecKeyRef.modulus
oder irgendetwas in der Art, wie es scheint).
Meine Frage: wie kann ich den Zugriff SecKeyRef.modulus
oder alternativ konvertieren Sie diese SecKeyRef
in NSData
oder etwas ähnliches? Dank
Bearbeiten
(weitere Informationen)
Ich bin mir SecKeyRef
dynamisch, durch diese Funktion habe ich noch:
func bytesToPublicKey(certData: NSData) -> SecKeyRef? {
guard let certRef = SecCertificateCreateWithData(nil, certData) else { return nil }
var secTrust: SecTrustRef?
let secTrustStatus = SecTrustCreateWithCertificates(certRef, nil, &secTrust)
if secTrustStatus != errSecSuccess { return nil }
var resultType: SecTrustResultType = UInt32(0) //result will be ignored.
let evaluateStatus = SecTrustEvaluate(secTrust!, &resultType)
if evaluateStatus != errSecSuccess { return nil }
let publicKeyRef = SecTrustCopyPublicKey(secTrust!)
return publicKeyRef
}
Was das bedeutet ist dauert die raw-byte-stream aus einer Bescheinigung, die ausgestrahlt werden können, von, sagen wir, ein Stück hardware mit PKI), und dann verwandelt sich in ein SecKeyRef
.
Edit 2
(Kommentare auf vorhandene Antworten, die von 7. Januar 2015)
Funktioniert nicht:
let mirror = Mirror(reflecting: mySecKeyObject)
for case let (label?, value) in mirror.children {
print (label, value)
}
Diese Ergebnisse, die in dieser Ausgabe in der Konsole:
Some <Raw SecKeyRef object>
Nicht sicher, was der string "Einige" bedeutet.
Darüber hinaus mirror.descendant("exponent")
(oder "E-Modul") Ergebnisse in nil
, auch wenn beim drucken der raw-Objekt in der Konsole, ich kann deutlich sehen, dass diese Eigenschaften vorhanden sind, und dass Sie in der Tat aufgefüllt.
Auch, wenn überhaupt möglich, ich möchte vermeiden, dass das speichern auf den Schlüsselbund, das Lesen als NSData
, und dann löschen aus dem Schlüsselbund. Wie bereits in der bounty-Beschreibung, wenn nur auf diese Weise möglich, bitte zitieren Sie eine autoritative Referenz. Danke für alle Antworten so weit.
- Haben Sie sah das Antwort noch? Oder die Antworten aufgelistet, here? Sie sind
Obj-C
aber es ist nicht schwer zu übersetzen. - vielen Dank für Ihren Kommentar. Leider habe ich ja schon kämmen durch diejenigen, die für ein paar Stunden jetzt, und hatte noch nicht viel Glück. Sie scheinen nicht zu sein, ganz das, was ich bin auf der Suche nach genau (Sie geht es hauptsächlich um das erzeugen von Schlüsselpaaren, wie es scheint). Vielleicht bin ich falsch.
- Das ist bedauerlich,. Ich konnte nicht wirklich was finden andere an diesem Thema und alles was den letzten ignoriert wurde. Ich habe keine spezifische Kenntnisse zu diesem Thema. Viel Glück und sorry, ich konnte nicht helfen!
- danke!!!
- stackoverflow.com/questions/27758446/...
let mirrorKey = Mirror(reflecting: secKey); let exponent = mirrorKey.descendant("exponent"); let modulus = mirrorKey.descendant("modulus");
- Schreiben Sie es in den Schlüsselbund und Sie erhalten eine
NSData
zurück. Sie können es löschen, nach, dass. Auf diese Weise ist auch das, was ich in meiner Produktions-app. - Früh Sie sagen, '...das ist mein Ziel, ist, nur um eine base64-public-key " und noch die Funktion, das Gebäude der
SecKeyRef
nimmt ein array von bytes (in NSData form) als parameter. Wenn Sie möchten, dass die öffentlichen Schlüssel in base64-Sie kann aus NSData. - vielen Dank für Ihre Antwort. Wie so? Das array von bytes (in NSData-form) ist eine ganze X509-Zertifikat.
- Mein Fehler, habe ich falsch gelesen, dass Absatz zu bedeuten, dass Sie waren vorbei in der public-key in NSData form. Koffein-Mangel. Wenn Sie das Zertifikat mit dem öffentlichen und privaten Schlüssel, ich bin 100% sicher, dass ich weiß, wie man den öffentlichen Schlüssel, der mit obj-c. Gebt mir ein paar zu übersetzen, dass der Swift.
- Ich weiß von Koffein Mangel nur allzu gut. Danke! Freue mich zu hören wieder von Ihnen.
- nur eine Anmerkung: die Verwendung von SecKeyCopyModulus in einer iOS-app wird von b abgelehnt von Apple: ich habe von iTunesConnect: Wir haben entdeckt, dass einer oder mehrere Probleme mit Ihrer letzten Lieferung für ".....". Für die Bearbeitung Ihrer Lieferung, die folgenden Probleme müssen behoben werden: Nicht-öffentliche API-Nutzung: Die app Referenzen, die nicht-öffentliche Symbole in .....: _SecKeyCopyModulus so vorsichtig sein.
- "Ich habe eine Funktion, die ich geben kann, ein modulus und den Exponenten, und es wird nur berechnet, was der öffentliche Schlüssel ist" -- modulus und exponent zusammen sind die public-key! Der rest ist nur Verpackung/dressing Dinge.
- haben u die Lösung gefunden für dieses Problem?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist tatsächlich möglich, zu extrahieren, modulus und exponent weder Schlüsselanhänger noch private API.
Gibt es den ( öffentlich, aber ohne Papiere ) - Funktion
SecKeyCopyAttributes
Extrakte eineCFDictionary
aus einerSecKey
.Eine nützliche Quelle für die Attribut-Tasten ist
SecItemConstants.c
Prüfung der Inhalte dieses Wörterbuchs finden wir einen Eintrag
"v_Data" : <binary>
. Ihr Inhalt ist DER-kodierte ASN fürSich bewusst sein, dass ganze zahlen sind gepolstert und mit einem null-byte, wenn Sie positiv sind und haben ein führendes 1-bit (also nicht zu verwechseln mit einem zwei-Komplement negative Zahl), so können Sie feststellen, ein byte mehr, als Sie erwarten. Wenn das passiert, schneiden Sie es Weg.
Implementieren Sie einen parser für dieses format oder die Gewissheit, dass Ihr Schlüssel Größe, hart-code der Extraktion. Für 2048-bit-Schlüssel (und 3-byte exponent), das format stellt sich heraus:
Insgesamt 10 + 1? + 256 + 3 = 269 oder 270 bytes.
(Ich landete eine vollständige schreiben der ASN-parser, so dass dieser code ist nicht getestet, Vorsicht!)
Beachten Sie, dass Sie zu extrahieren, können details des private Tasten in sehr viel die gleiche Weise. Mit DER Terminologie ist das format
v_Data
:Analyse per hand ist wohl schlecht beraten, da jede der ganzen zahlen möglicherweise wurde aufgefüllt.
Nota bene: Das format des public-key ist unterschiedlich, wenn der Schlüssel generiert wurde, auf macOS; die Struktur, die oben gegeben ist gewickelt etwa so:
Den bit-string ist, DER-kodierte ASN des Formular.
SecKeyCopyExternalRepresentation(publicKey, nil)
gibt Siev_Data
direkt, als jamone notes.Update Die Antwort unten führen könnte, in Ihre app abgelehnt wurde, aufgrund der Benutzung von nicht-öffentlichen API.
Die Antwort liegt in der SecRSAKey.h - Datei von der Apple-opensource-Webseite (Sicherheit ist ein Teil des code, dass Apple opensourced). Die Datei ist nicht groß, und bei anderen Sachen es erklärt die folgenden zwei wichtigen Funktionen:
Können Sie fügen Sie diese Funktionen, um Ihre bridging-header, um in der Lage sein, um Sie zu rufen die von Swift, auch dabei können Sie aus
CFDataRef
zuNSData*
als die zwei Typen gebührenfrei gebrückt:Demo Swift Verwendung:
Dies ist eine private API-obwohl, und es könnte eine chance sein, es wird nicht mehr verfügbar sein, irgendwann, aber ich sah über die Versionen von
Security
öffentlich gemacht (http://www.opensource.apple.com/source/Security), und sieht wie die beiden Funktionen sind in allen von Ihnen. Mehr, daSecurity
ist eine kritische Komponente des Betriebssystems, es ist unwahrscheinlich, dass Apple sich große Veränderungen über es.Getestet auf iOS 8.1, iOS 9.2 und OSX 10.10.5, und der code funktioniert auf allen drei Plattformen.
SecKeyCopyModulus
(zum Beispiel), müssen Sie erstellen IhreSecKeyRef
Objekt mituint8_t *keyData
, das würde bedeuten ich muss schon die public-key-Daten (allerdings habe ich diese nicht habe; ich habe einfach die raw-bytes des gesamten Zertifikats). Hab ich was übersehen?SecKeyCreateRSAPublicKey
im Fall erstellen Sie den Schlüssel selbst. In Ihrem Fall erhalten Sie den Schlüssel mitSecTrustCopyPublicKey
, die extrahiert den Schlüssel aus dem Zertifikat aus einer Datei geladen mitSecCertificateCreateWithData
.SecKeyRef
undurchsichtige Struktur. Siehe SecKeyPriv.h -SecKeyRef
ist ein alias für__SecKey
, die einevoid *key;
Feld hält die roh-Daten für den Schlüssel.The app references non-public symbols in ___: _SecKeyCopyModulus
Ich habe unten den gleichen Weg versuchen zu tun, SSL-Public-Key-Pinning. Die API ' s sind so ziemlich nicht vorhanden, und die Lösung, die ich fand, war, ihn in die Schlüsselanhänger, die kann man dann abrufen, als NSData (die dann Base64-Kodiert). Es ist schrecklich, aber das einzige, was ich finden konnte, nach einem Tag oder so der Forschung (ohne Rückgriff auf die Bündelung von OpenSSL mit meiner app).
Ich portiert einige meiner code über Swift, aber ich habe es noch nicht getestet sehr viel, so bin ich mir nicht 100% sicher, dass es funktioniert: https://gist.github.com/chedabob/64a4cdc4a1194d815814
Es basiert off dieser Obj-C-code (von dem ich zuversichtlich bin, dass funktioniert, wie es in einer Produktions-app): https://gist.github.com/chedabob/49eed109a3dfcad4bd41
SecKeyRef
ist eine Struktur, so gibt es eine chance, dass er reflektiert werden kann, mitMirror()
abrufen, die die gewünschten Werte ein.Habe ich gefunden, einzelne Obj-c re-Implementierung des ASN.1-parser in ein verlassenes Projekt, das scheint zu funktionieren. Problem ist, es verwendet große Zeiger und tricks, die ich weiß nicht, wie das zu übersetzen in Swift (nicht einmal sicher, dass einige es möglich ist). Es sollte möglich sein, erstellen Sie eine swift-freundlich wrapper um Sie, da der einzige Eingang, den es nimmt, ist die NSData.
Alles, was auf dem Netz ist mit dem speichern und abrufen in der Schlüsselbund-trick, um den pub-key-Daten, die auch wirklich beliebt libs wie TrustKit. Ich fand Verweis in der Apple docs auf SecKeyRef, um die Ursache (glaube ich):
Seit
SecCertificateCopyValues
ist nicht verfügbar auf iOS in dieser Zeit, Sie beschränkt sich entweder Parsen dem Zertifikat Daten, oder das Keychain-Element shuffle.Fand ich, wie man Daten für eine
SecKey
.Dieser scheint gut zu funktionieren und ich in der Lage, erfolgreich vergleichen Sie den öffentlichen Schlüssel.
Dies ist in Swift 3 (Xcode 8 beta 3)
SecKeyCopyExternalRepresentation
?CFData
if let pinnedPublicKeyData = SecKeyCopyExternalRepresentation(pinnedPublicKey, nil), let publicKeyData = SecKeyCopyExternalRepresentation(publicKey, nil), pinnedPublicKeyData == publicKeyData { // they match }
Denkst du über die Verwendung von
SecCertificateCopyData()
? Die daraus resultierendeCFData
ist gebührenfrei überbrückt, denke ich.Finden https://developer.apple.com/library/ios/documentation/Security/Reference/certifkeytrustservices/, um zu sehen, in der jeweiligen Dokumentation der API.
SecCertificateCopyData()
können verwendet werden zum extrahieren des öffentlichen Schlüssels aus dem SecKeyRef Objekt, oder der exponent/Modul? Danke.SecCertificateRef
für, die. Aber Sie einer von denen gefunden, die Ihren öffentlichen Schlüssel des trust-Sie kopieren dieSecKeyRef
aus.Vom Wie kodiere ich eine nicht verwaltete<SecKey> base64 zu senden, auf einem anderen server? :
will man Aber vermeiden Sie die Zugabe an Schlüsselbund, können Sie verwenden Spiegel:[edit: der Spiegel funktioniert nicht nach Josh]
mirrorKey.descendant("exponent")
undmirrorKey.descendant("modulus")
beide führennil
.Schrieb ich diese eine Basis auf einige andere Antwort bei stackoverflow. Momentan benutze ich es in meine Produktion, aber ich bin gerne von anderen Lösungen, die nicht verlangen, zu schreiben, in die Schlüsselbund.