Mac OS X 10.7(狮子山猫)中,libcrypto已被弃用。

6

我刚刚想在Lion上使用libcrypto,但整个API似乎都已被弃用。自10.6.6以来,手册页面都没有更新。

有人知道Lion上替代libcrypto的是什么吗?

3个回答

7

如果你知道你在做什么,只想消除这些警告,一种方法是添加

#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 

针对相关的头文件进行更改 - 在我的情况下是 /usr/include/openssl/crypto.h 和 /usr/include/openssl/md5.h。


1
最好将其添加到实际使用openssl的位置,而不是修补系统头文件。 - toasted_flakes

7

libcrypto是OpenSSL的一部分,它并没有改变太多。它不会消失,但是苹果建议开发者使用他们的CDSA(通用数据安全架构)库,而不是直接使用OpenSSL。


谢谢 :) 这让我找到了 Security/SecKey.h 和相关函数,它们看起来正好符合我的需求。 - yarpa
实际上,SecKey只是解决方案的一半。它处理密钥生成,但似乎不支持任何实际的加密操作(尽管iOS版本似乎支持,但我正在查看Lion)。在Lion中,CDSA已被弃用,因此原始问题仍然存在。(请参见Security.framework/cssmtype.h的弃用通知)。搜索继续进行。 - yarpa

4

好的,我在这里回答自己的问题。

10.7版本将Transforms引入了Security.framework中,它与SecKey紧密结合。Transforms可以让您做很多事情,包括编码(例如base64),摘要,签名/验证和加密。

以下是如何签署一些数据的示例。所有的转换都遵循相同的基本模式;如果您查看Security.framework的头文件,您会看到每种类型的变换的头文件。这些来自SecTransformReadTransform.h和 SecSignVerifyTransform.h。为了简单起见,我省略了任何错误检查或清理代码。

    NSData *dataToBeSigned = ;// Get this from somewhere. We set sha1 attributes down below, so this should be a sha1 digest
    SecKeyRef *key = ;// Get this from somewhere; keychain or SecItemImport
    SecGroupTransformRef group = SecTransformCreateGroupTransform();
    CFReadStreamRef readStream = NULL;
    SecTransformRef readTransform = NULL;
    SecTransformRef signingTransform = NULL;

    // Setup our input stream as well as an input transform
    readStream = CFReadStreamCreateWithBytesNoCopy(kCFAllocatorDefault,
                                                    [dataToBeSigned bytes],
                                                    [dataToBeSigned length],
                                                    kCFAllocatorNull); // Pass Null allocator so it doesn't free NSData's bytes

    readTransform = SecTransformCreateReadTransformWithReadStream(readStream);

    // Setup a signing transform
    signingTransform = SecSignTransformCreate(key, NULL);
    SecTransformSetAttribute(signingTransform, kSecInputIsDigest, kCFBooleanTrue, NULL);
    SecTransformSetAttribute(signingTransform, kSecDigestTypeAttribute, kSecDigestSHA1, NULL);

    // Connect read and signing transform; Have read pass its data to the signer
    SecTransformConnectTransforms(readTransform, kSecTransformOutputAttributeName,
                                    self.signingTransformRef, kSecTransformInputAttributeName,
                                    group, NULL);

    // Execute the sequence of transforms (group)
    // The last one in the connected sequence is the return value
    NSData *signature = SecTransformExecute(group, NULL);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接