我将 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
,则应使用 base64 编码。
Objective-C
您可以使用(参见NSString Class Reference)
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding
例子:
NSString *myString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];
备注:请注意 NSData
值必须对指定的编码(上例中为 UTF-8)有效,否则将返回 nil
:
如果由于某种原因初始化失败(例如,如果数据不代表用于编码的有效数据),则返回 nil。
之前的 Swift 3.0
String(data: yourData, encoding: NSUTF8StringEncoding)
斯威夫特 3.0 以后
String(data: yourData, encoding: .utf8)
请参阅String#init(data:encoding:) Reference
之前的 Swift 3.0:
String(data: yourData, encoding: NSUTF8StringEncoding)
对于 Swift 4.0:
String(data: yourData, encoding: .utf8)
我相信您的“P”作为 dataWithBytes 参数
NSData *keydata = [NSData dataWithBytes:P length:len];
应该是“buf”
NSData *keydata = [NSData dataWithBytes:buf length:len];
因为 i2d_PrivateKey 将指向输出缓冲区 p 的指针放在缓冲区的末尾并等待进一步的输入,并且 buf 仍然指向缓冲区的开头。
以下代码适用于我,其中 pkey 是指向 EVP_PKEY 的指针:
unsigned char *buf, *pp;
int len = i2d_PrivateKey(pkey, NULL);
buf = OPENSSL_malloc(len);
pp = buf;
i2d_PrivateKey(pkey, &pp);
NSData* pkeyData = [NSData dataWithBytes:(const void *)buf length:len];
DLog(@"Private key in hex (%d): %@", len, pkeyData);
在使用以下命令并检查 mypkey.pem 的输出后,您可以使用在线转换器将二进制数据转换为 base 64 (http://tomeko.net/online_tools/hex_to_base64.php?lang=en),并将其与 cert 文件中的私钥进行比较:
openssl pkcs12 -in myCert.p12 -nocerts -nodes -out mypkey.pem
我参考了您的问题和this EVP function site作为我的答案。
斯威夫特 5:
String(data: data!, encoding: String.Encoding.utf8)
斯威夫特 3:
String(data: data, encoding: .utf8)
将任意 NSData 转换为 NSString 的一种简单方法是对其进行 base64 编码。
NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];
然后,您可以将其存储到您的数据库中以供以后重复使用。只需将其解码回 NSData。
不定期副业成功案例分享
po [[NSString alloc] initWithData:myData encoding:4]
NSData
可能包含任何字节值,包括 UTF-8 范围之外的值,这个答案怎么会有很多赞成票?