Безопасность преобразовывает основы
Преобразования безопасности могут выполнить много задач, включая кодирование и декодирование, шифрование и дешифрование, и подписание и проверку. В этой главе кодирование Base64 и декодирование используются в качестве примера того, как использовать, преобразовывает, потому что они - самые простые преобразования.
Несмотря на то, что Ваше определенное использование API может не включить кодирование Base64, основные шаги для любого преобразования безопасности подобны; только преобразование специфичные параметры (ключи шифрования, например) отличаются.
Для предотвращения беспорядка этот документ использует Базовые типы данных Основы повсюду. Однако, потому что Основа и Базовые типы Основы, используемые этим API, бесплатные соединенный мостом, можно занять место NSData
объекты для CFDataRef
, NSString
для CFString
, и т.д.
Преобразования Base64 продемонстрированы в двух различных формах в разделах, следующих:
Основные Преобразования выполнения описывают, как выполнить кодирование Base64 и декодирование использования a
CFDataRef
возразите как ввод и вывод.Цепочечное выполнение Преобразовывает, описывает, как объединить многократные преобразования в цепочку вместе для выполнения кодирования Base64 и передекодирования на единственном шаге.
Выполнение основные преобразования
Основные шаги для выполнения преобразования являются относительно прямыми:
Создайте объекты данных или потоки для использования для исходных данных.
Поскольку большинство преобразовывает, они должны быть
NSData
илиCFDataRef
объекты.Если Вы считываете данные из файла с помощью чтения, преобразовывают, необходимо обеспечить
NSInputStream
илиCFReadStreamRef
объект.Этот тривиальный пример создает объект CFData из струны до как показано ниже:
sourceData = CFDataCreate(
kCFAllocatorDefault,
(const unsigned char *)sourceCString,
(strlen(sourceCString) + 1));
Создайте объект преобразования путем вызова одного из
*Create*
функции, включая:Этот пример создает объекты кодера и декодера Base64 следующим образом:
encoder = SecEncodeTransformCreate(kSecBase64Encoding, &error);
if (error) { CFShow(error); exit(-1); }
decoder = SecDecodeTransformCreate(kSecBase64Encoding, &error);
if (error) { CFShow(error); exit(-1); }
Установите параметры для преобразования путем вызова
SecTransformSetAttribute
.В целом все преобразовывает за исключением
SecTransformCreateReadTransformWithReadStream
потребуйте значения дляkSecTransformInputAttributeName
. Можно найти список других требуемых и дополнительных атрибутов для каждого типа преобразования в документации для того преобразования.Например, это преобразование устанавливает входной атрибут в кодер следующим образом:
SecTransformSetAttribute(encoder, kSecTransformInputAttributeName,
sourceData, &error);
if (error) { CFShow(error); exit(-1); }
Выполните преобразование путем вызова
SecTransformExecute
илиSecTransformExecuteAsync
.Например:
encodedData = SecTransformExecute(encoder, &error);
if (error) { CFShow(error); exit(-1); }
Перечисление 1-1 демонстрирует очень простое использование преобразований, чтобы закодировать и впоследствии декодировать блок данных с помощью кодирования Base64.
Перечисление 1-1 Основная безопасность преобразовывает
#include <CoreFoundation/CoreFoundation.h> |
#include <Security/Security.h> |
void ShowAsString(CFDataRef data); |
char *sourceCString = "All these worlds are yours except Europa."; |
/* Encrypts and decrypts a blob of data. */ |
main(int argc, char *argv[]) |
{ |
SecTransformRef encoder, decoder; |
CFDataRef sourceData = NULL, encodedData = NULL, decodedData = NULL; |
CFErrorRef error = NULL; |
/* Create a CFData object for the source C string. */ |
sourceData = CFDataCreate( |
kCFAllocatorDefault, |
(const unsigned char *)sourceCString, |
(strlen(sourceCString) + 1)); |
ShowAsString(sourceData); |
/* Create the transform objects */ |
encoder = SecEncodeTransformCreate(kSecBase64Encoding, &error); |
if (error) { CFShow(error); exit(-1); } |
decoder = SecDecodeTransformCreate(kSecBase64Encoding, &error); |
if (error) { CFShow(error); exit(-1); } |
/* Tell the encode transform to get its input from the |
sourceData object. */ |
SecTransformSetAttribute(encoder, kSecTransformInputAttributeName, |
sourceData, &error); |
if (error) { CFShow(error); exit(-1); } |
/* Execute the encode transform. */ |
encodedData = SecTransformExecute(encoder, &error); |
if (error) { CFShow(error); exit(-1); } |
ShowAsString(encodedData); |
CFRelease(encoder); |
CFRelease(sourceData); |
/* Tell the decode transform to get its input from the |
encodedData object. */ |
SecTransformSetAttribute(decoder, kSecTransformInputAttributeName, |
encodedData, &error); |
if (error) { CFShow(error); exit(-1); } |
/* Execute the decode transform. */ |
decodedData = SecTransformExecute(decoder, &error); |
if (error) { CFShow(error); exit(-1); } |
ShowAsString(decodedData); |
CFRelease(decoder); |
CFRelease(encodedData); |
CFRelease(decodedData); |
} |
/* Creates a CFString from a CFData object, does a CFShow |
on that string, then releases the CFString. |
*/ |
void ShowAsString(CFDataRef data) |
{ |
CFStringRef str = CFStringCreateFromExternalRepresentation( |
kCFAllocatorDefault, |
data, |
kCFStringEncodingUTF8); |
CFShow(str); |
CFRelease(str); |
} |
Цепочечное выполнение преобразовывает
В дополнение к частному лицу преобразовывает, безопасность преобразовывает API, также обеспечивает способ объединить многократные преобразования в цепочку в последовательности, с каждым преобразовывают работу на результатах предыдущего преобразования.
Создайте преобразования и установите их атрибуты соответственно, как описано в Выполнении Основных Преобразований.
Создайте группу, преобразовывают путем вызова
SecTransformCreateGroupTransform
.Соедините преобразования проводом вместе путем вызова
SecTransformConnectTransforms
.В этом вызове Вы говорите группе, какое свойство источника преобразовывают его, должен соединить проводом к который свойство целевого преобразования. Как правило, Вы соединяетесь
kSecTransformOutputAttributeName
свойство первого преобразования возражает в Вашем конвейере противkSecTransformInputAttributeName
свойство второго объекта преобразования. Например:SecTransformConnectTransforms(encoder, kSecTransformOutputAttributeName,
decoder, kSecTransformInputAttributeName, group, &error);
Запустите преобразование путем вызова
SecTransformExecute
илиSecTransformExecuteAsync
на группе.
Перечисление 1-2 является заменой для содержания main
функция в Перечислении 1-1. Эта версия выполняет Base64, кодируют и декодируют операции в конвейере вместо как две отдельных задачи. (Это не ряд операций, который обычно выполняется вместе, но это - хороший способ продемонстрировать основной процесс объединения в цепочку, не имея необходимость сначала объяснять многократные типы преобразования.)
Перечисление 1-2 Цепочечная безопасность преобразовывает
SecTransformRef encoder, decoder; |
CFDataRef sourceData = NULL, decodedData = NULL; |
CFErrorRef error = NULL; |
SecGroupTransformRef group; |
sourceData = CFDataCreate( |
kCFAllocatorDefault, |
(unsigned char *)sourceCString, |
(strlen(sourceCString) + 1)); |
/* Create the transform objects */ |
encoder = SecEncodeTransformCreate(kSecBase64Encoding, &error); |
if (error) { CFShow(error); exit(-1); } |
decoder = SecDecodeTransformCreate(kSecBase64Encoding, &error); |
if (error) { CFShow(error); exit(-1); } |
/* Tell the encode transform to get its input from the |
sourceData object. */ |
SecTransformSetAttribute(encoder, kSecTransformInputAttributeName, sourceData, &error); |
if (error) { CFShow(error); exit(-1); } |
/* Tell the decode transform to get its input from the |
encode transform's output. */ |
group = SecTransformCreateGroupTransform(); |
SecTransformConnectTransforms(encoder, kSecTransformOutputAttributeName, |
decoder, kSecTransformInputAttributeName, group, &error); |
/* Execute both transforms. */ |
decodedData = SecTransformExecute(group, &error); |
if (error) { CFShow(error); exit(-1); } |
ShowAsString(sourceData); |
ShowAsString(decodedData); |
CFRelease(sourceData); |
CFRelease(group); |