Przechowuję klucz prywatny openssl EVP_PKEY jako nsdata. W tym celu serializuję do strumienia bajtów przy użyciu poniższego kodu
unsigned char *buf, *p;
int len;
len = i2d_PrivateKey(pkey, NULL);
buf = OPENSSL_malloc(len);
p = buf;
i2d_PrivateKey(pkey, &p);
gdzie pkey jest typu EVP_PKEY. Następnie przechowuję bajty z bufora `` p '' jako NSData przy użyciu linii podanej poniżej
NSData *keydata = [NSData dataWithBytes:P length:len];
Teraz konwertuję go na NSString przy użyciu kodu podanego poniżej, ale kiedy drukuję go w konsoli, podaje kilka innych znaków.
NSString *content =[ NSString stringWithCString:[keydata bytes] encoding:NSUTF8StringEncoding];
Czy ktoś mógłby pomóc?
Zasadniczo chcę przechowywać EVP_PKEY w bazie danych sqlite
czy jestem na dobrej drodze? Dzięki.
NSData
celuNSString
.Odpowiedzi:
Cel C
Możesz użyć (zobacz NSString Class Reference )
Przykład:
Uwaga : proszę zauważyć, że
NSData
wartość musi być prawidłowa dla określonego kodowania (UTF-8 w powyższym przykładzie), w przeciwnym razienil
zostanie zwrócona:Wcześniejszy Swift 3.0
Swift 3.0 i nowsze
Zobacz String # init (data: encoding :) Reference
źródło
po [[NSString alloc] initWithData:myData encoding:4]
NSData
może zawierać dowolną wartość bajtową, w tym te spoza zakresu UTF-8?Przed Swift 3.0:
Dla Swift 4.0:
źródło
Uważam, że Twoje „P” jest parametrem dataWithBytes
powinno być „buf”
ponieważ i2d_PrivateKey umieszcza wskaźnik do bufora wyjściowego p na końcu bufora i czeka na dalsze wejście, a buf nadal wskazuje początek bufora.
Poniższy kod działa dla mnie, gdzie pkey jest wskaźnikiem do EVP_PKEY:
Możesz użyć konwertera online, aby przekonwertować swoje dane binarne do bazy 64 ( http://tomeko.net/online_tools/hex_to_base64.php?lang=en ) i porównać je z kluczem prywatnym w pliku certyfikatu po użyciu następującego polecenia i sprawdzanie wyjścia mypkey.pem:
Odwołałem się do twojego pytania i tej strony funkcji EVP, aby uzyskać odpowiedź.
źródło
Swift 3:
źródło
Prostym sposobem na przekonwertowanie dowolnych NSData na NSString jest zakodowanie ich w standardzie base64.
Następnie możesz zapisać go w swojej bazie danych do późniejszego wykorzystania. Po prostu dekoduj go z powrotem do NSData.
źródło
Swift 5 :
źródło