Я храню закрытый ключ openssl EVP_PKEY как nsdata. Для этого я сериализую в поток байтов, используя приведенный ниже код.
unsigned char *buf, *p;
int len;
len = i2d_PrivateKey(pkey, NULL);
buf = OPENSSL_malloc(len);
p = buf;
i2d_PrivateKey(pkey, &p);
где pkey имеет тип EVP_PKEY. Затем я сохраняю байты из буфера 'p' как NSData, используя строку, приведенную ниже
NSData *keydata = [NSData dataWithBytes:P length:len];
Теперь я конвертирую его в NSString, используя приведенный ниже код, но когда я печатаю его на консоли, он дает некоторые другие символы.
NSString *content =[ NSString stringWithCString:[keydata bytes] encoding:NSUTF8StringEncoding];
Может кто-нибудь помочь?
В основном я хочу сохранить EVP_PKEY в базе данных sqlite
я на правильном пути? Спасибо.
NSData
форматNSString
.Ответы:
Objective-C
Вы можете использовать (см. Справочник по классам NSString )
Пример:
Примечание : обратите внимание, что
NSData
значение должно быть действительным для указанной кодировки (UTF-8 в приведенном выше примере), в противном случаеnil
будет возвращено:Приор Свифт 3.0
Swift 3.0 и выше
См. String # init (data: encoding :) Ссылка
источник
po [[NSString alloc] initWithData:myData encoding:4]
NSData
может содержать любое байтовое значение, в том числе вне диапазона UTF-8?Предыдущий Swift 3.0:
Для Swift 4.0:
источник
Я считаю, что ваш "P" как параметр dataWithBytes
должно быть "буф"
поскольку i2d_PrivateKey помещает указатель на выходной буфер p в конец буфера и ожидает дальнейшего ввода, а buf все еще указывает на начало вашего буфера.
Для меня работает следующий код, где pkey - указатель на EVP_PKEY:
Вы можете использовать онлайн-конвертер для преобразования ваших двоичных данных в базу 64 ( http://tomeko.net/online_tools/hex_to_base64.php?lang=en ) и сравнить их с закрытым ключом в вашем файле сертификата после использования следующей команды и проверка вывода mypkey.pem:
Я сослался на ваш вопрос и этот сайт функции EVP для своего ответа.
источник
Swift 3:
источник
Простой способ преобразовать произвольные NSData в NSString - это закодировать их в формате base64.
Затем вы можете сохранить его в своей базе данных для повторного использования позже. Просто декодируйте его обратно в NSData.
источник
Swift 5 :
источник