すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:OSS SDK for iOSを使用してデータセキュリティを実装する

最終更新日:Aug 27, 2024

iOS用のObject Storage Service (OSS) SDKは、アップロードとダウンロードのデータセキュリティを確保するためのデータ整合性チェックを提供します。

アップロードでのデータ整合性チェック

モバイルネットワークの複雑さのために、データがクライアントとサーバー間で転送されるときにエラーが発生する可能性があります。 OSSは、MD5およびCRC-64アルゴリズムに基づいてエンドツーエンドのデータ整合性チェックを提供します。

  • MD5検証

    オブジェクトをアップロードするときにリクエストにContent-MD5ヘッダーを指定した場合、OSSはオブジェクトに対してMD5検証を実行し、データの整合性を確保します。 オブジェクトは、受信したオブジェクトのMD5ハッシュがリクエストで指定されたContent-MD5値と一致する場合にのみアップロードされます。

    OSSPutObjectRequest * put = [OSSPutObjectRequest new];
    // Specify the name of the bucket. Example: examplebucket. 
    put.bucketName = @"examplebucket";
    // Specify the full path of the object. Example: exampledir/exampleobject.txt. Do not include the bucket name in the full path. 
    put.objectKey = @"exampledir/exampleobject.txt";
    put.uploadingFileURL = [NSURL fileURLWithPath:@"<filePath>"];
    // put.uploadingData = <NSData *>; // Directly upload NSData. 
    // Specify Content-MD5. 
    put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; 
    OSSTask * putTask = [client putObject:put];
    [putTask continueWithBlock:^id(OSSTask *task) {
        if (!task.error) {
            NSLog(@"upload object success!");
        } else {
            NSLog(@"upload object failed, error: %@" , task.error);
        }
        return nil;
    }];
    // waitUntilFinished blocks execution of the current thread but does not block the task progress. 
    // [putTask waitUntilFinished];     
  • CRC 検証

    オブジェクトの64ビットCRC値は、オブジェクトがアップロードされているときに計算できます。 次のサンプルコードは、オブジェクトをアップロードするときにCRCを実行する方法の例を示しています。

    OSSPutObjectRequest * put = [OSSPutObjectRequest new];
    // Specify the name of the bucket. Example: examplebucket. 
    put.bucketName = @"examplebucket";
    // Specify the full path of the object. Example: exampledir/exampleobject.txt. Do not include the bucket name in the full path. 
    put.objectKey = @"exampledir/exampleobject.txt";
    put.uploadingFileURL = [NSURL fileURLWithPath:@"<filePath>"];
    // put.uploadingData = <NSData *>; // Directly upload NSData. 
    // Enable CRC verification. 
    put.crcFlag = OSSRequestCRCOpen;
    OSSTask * putTask = [client putObject:put];
    [putTask continueWithBlock:^id(OSSTask *task) {
        if (!task.error) {
            NSLog(@"upload object success!");
        } else {
            NSLog(@"upload object failed, error: %@" , task.error);
        }
        return nil;
    }];
    // waitUntilFinished blocks execution of the current thread but does not block the task progress. 
    // [putTask waitUntilFinished];

ダウンロードでのデータ整合性チェック

OSS SDK for iOSは、ダウンロード中の64ビットCRC値に基づいてエンドツーエンドのデータ整合性チェックを提供します。

CRC検証が有効になっている場合、OSSはストリームからデータを読み取った後にデータの整合性を自動的にチェックします。

次のサンプルコードは、ダウンロードでCRC検証を有効にする方法の例を示しています。

OSSGetObjectRequest * request = [OSSGetObjectRequest new];
request.bucketName = @"examplebucket";
request.objectKey = @"exampledir/exampleobject.txt";
// Specify the local path to which the object is downloaded.
request.downloadToFileURL = [NSURL fileURLWithPath:@"<filePath>"];
// Enable CRC verification. 
request.crcFlag = OSSRequestCRCOpen;
OSSTask * task = [client getObject:request];
[task continueWithBlock:^id(OSSTask *task) {
    if (!task.error) {
        NSLog(@"download object success!");
    } else {
        NSLog(@"download object failed, error: %@" ,task.error);
    }
    return nil;
}];
// [task waitUntilFinished];

onReceiveDataブロックが設定されている場合は、CRC値が同じかどうかを確認する必要があります。

OSSGetObjectRequest * request = [OSSGetObjectRequest new];
request.bucketName = @"examplebucket";
request.objectKey = @"exampledir/exampleobject.txt";
// Specify the local path to which the object is downloaded.
request.downloadToFileURL = [NSURL fileURLWithPath:@"<filePath>"];
// Enable CRC verification.
request.crcFlag = OSSRequestCRCOpen;
__block uint64_t localCrc64 = 0;
NSMutableData *receivedData = [NSMutableData data];
request.onRecieveData = ^(NSData *data) {
    if (data)
    {
        NSMutableData *mutableData = [data mutableCopy];
        void *bytes = mutableData.mutableBytes;
        localCrc64 = [OSSUtil crc64ecma:localCrc64 buffer:bytes length:data.length];
        [receivedData appendData:data];
    }
};
__block uint64_t remoteCrc64 = 0;
OSSTask * task = [client getObject:request];
[task continueWithBlock:^id(OSSTask *task) {
    OSSGetObjectResult *result = task.result;
    if (result.remoteCRC64ecma)
    {
        NSScanner *scanner = [NSScanner scannerWithString:result.remoteCRC64ecma];
        [scanner scanUnsignedLongLong:&remoteCrc64];
        if (remoteCrc64 == localCrc64)
        {
            NSLog(@"CRC-64 verification successful!");
        }
        else
        {
            NSLog(@"CRC-64 verification failed!!");
        }
   }
   return nil;
}];
// waitUntilFinished blocks execution of the current thread but does not block the task progress. 
// [task waitUntilFinished];