相关疑难解决方法(0)

如何在iOS上固定证书的公钥

在提高我们正在开发的iOS应用程序的安全性的同时,我们发现需要PIN(全部或部分)服务器的SSL证书来防止中间人攻击.

即使有各种方法可以做到这一点,当你搜索这个时我只找到了固定整个证书的例子.这种做法带来了一个问题:一旦证书更新,您的应用程序将无法再连接.如果您选择固定公钥而不是整个证书,您将发现自己(我相信)处于同样安全的情况,同时对服务器中的证书更新更具弹性.

但是你怎么做的?

security iphone ssl ipad ios

49
推荐指数
4
解决办法
3万
查看次数

我可以从Swift中的SecKeyRef对象获得模数或指数吗?

在Swift中,我SecKeyRef通过调用SecTrustCopyPublicKey一些原始的X509证书数据来创建一个对象.这就是这个SecKeyRef对象的样子.

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>)
Run Code Online (Sandbox Code Playgroud)

基本上,这个SecKeyRef对象包含大量关于公钥的信息,但似乎没有办法将它实际转换SecKeyRef为字符串NSData,或其他任何东西(这是我的目标,只是为了得到一个base64公钥).

但是,我有一个函数,我可以给一个modulus和一个exponent,它只会计算公钥是什么.我通过传递从上面记录的数据来测试它SecKeyRef.

但不知怎的,我无法从SecKeyRef对象访问这些属性(我只能在控制台中看到整个对象;例如,我SecKeyRef.modulus似乎无法做或任何类型的东西,似乎).

我的问题:我如何访问SecKeyRef.modulus,或者将其转换SecKeyRefNSData类似的东西?谢谢

编辑

(欲获得更多信息)

我正在创建我的SecKeyRef动态,通过这个函数,我有:

func bytesToPublicKey(certData: NSData) -> SecKeyRef? {
    guard let certRef = SecCertificateCreateWithData(nil, …
Run Code Online (Sandbox Code Playgroud)

encryption cryptography public-key-encryption ios swift

25
推荐指数
3
解决办法
6199
查看次数

如何将非托管<CFData>转换为NSData?

我需要将Objective-C转换为Swift以从通讯簿中获取联系人的图像.但是,我得到一个错误与投从CFDataNSData,我不知道如何使这项工作.我该怎么做才能使这项工作正常进行?

在Objective-C中:

ABRecordID contactID = ABRecordGetRecordID(contactRef);
ABAddressBookRef addressBook = ABAddressBookCreate();

ABRecordRef origContactRef = ABAddressBookGetPersonWithRecordID(addressBook, contactID);

if (ABPersonHasImageData(origContactRef)) {
    NSData *imgData = (NSData*)ABPersonCopyImageDataWithFormat(origContactRef, kABPersonImageFormatOriginalSize);
    img = [UIImage imageWithData: imgData]; 

    [imgData release];
}

CFRelease(addressBook);

return img;
Run Code Online (Sandbox Code Playgroud)

在Swift中:

var image: UIImage!

if ABPersonHasImageData(person) {
    var imgData = (ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatOriginalSize))
    image = UIImage.imageWithData(imgData) //Here get the error 
}
Run Code Online (Sandbox Code Playgroud)

swift xcode6

6
推荐指数
1
解决办法
3927
查看次数

如何将非托管<SecKey>编码为base64以发送到另一台服务器?

我正在尝试使用密钥对加密来验证我的应用程序和我的PHP服务器之间的身份.为此,我需要在我的应用程序中生成公钥后将公钥发送到服务器.

if let pubKey = NSData(base64EncodedData: publicKey, options: NSDataBase64DecodingOptions.allZeros)! {
    println(pubKey)
}
Run Code Online (Sandbox Code Playgroud)

publicKey是类型的Unmanaged<SecKey>.

我在上面的代码中得到的错误是: Extra argument 'base64EncodedData' in call

我该怎么做?有没有更好的办法?

编辑:这是密钥对的生成方式:

var publicKeyPtr, privateKeyPtr: Unmanaged<SecKey>?
let parameters = [
    String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
    String(kSecAttrKeySizeInBits): 2048
]
let result = SecKeyGeneratePair(parameters, &publicKeyPtr, &privateKeyPtr)
let publicKey = publicKeyPtr!.takeRetainedValue()
let privateKey = privateKeyPtr!.takeRetainedValue()
let blockSize = SecKeyGetBlockSize(publicKey)
Run Code Online (Sandbox Code Playgroud)

编辑2:所以问题是SecKey不是NSData,所以我的问题应该是:如何将publicKey:SecKey转换为NSData?

base64 public-key-encryption swift

3
推荐指数
1
解决办法
3448
查看次数