Object Storage Service (OSS) の iOS SDK は、アップロードとダウンロードにおけるデータセキュリティを確保するために、データ完全性チェック機能を提供します。
アップロードにおけるデータ完全性チェック
モバイルネットワークは複雑であるため、クライアントとサーバー間でデータが転送される際にエラーが発生する可能性があります。OSS は、MD5 および CRC-64 アルゴリズムに基づいたエンドツーエンドのデータ完全性チェックを提供します。
MD5 検証
オブジェクトをアップロードする際にリクエストで `Content-MD5` ヘッダーを指定すると、OSS はオブジェクトに対して MD5 検証を実行し、データ完全性を確保します。受信したオブジェクトの MD5 ハッシュがリクエストで指定された `Content-MD5` の値と一致する場合にのみ、オブジェクトはアップロードされます。
OSSPutObjectRequest * put = [OSSPutObjectRequest new]; // バケット名を指定します。例:examplebucket。 put.bucketName = @"examplebucket"; // オブジェクトの完全なパスを指定します。例:exampledir/exampleobject.txt。完全なパスにバケット名を含めないでください。 put.objectKey = @"exampledir/exampleobject.txt"; put.uploadingFileURL = [NSURL fileURLWithPath:@"<filePath>"]; // put.uploadingData = <NSData *>; // NSData を直接アップロードします。 // 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 は現在のスレッドの実行をブロックしますが、タスクの進行はブロックしません。 // [putTask waitUntilFinished];CRC 検証
オブジェクトの 64 ビット CRC 値は、オブジェクトのアップロード中に計算できます。次のサンプルコードは、オブジェクトのアップロード時に CRC を実行する方法の例です。
OSSPutObjectRequest * put = [OSSPutObjectRequest new]; // バケット名を指定します。例:examplebucket。 put.bucketName = @"examplebucket"; // オブジェクトの完全なパスを指定します。例:exampledir/exampleobject.txt。完全なパスにバケット名を含めないでください。 put.objectKey = @"exampledir/exampleobject.txt"; put.uploadingFileURL = [NSURL fileURLWithPath:@"<filePath>"]; // put.uploadingData = <NSData *>; // NSData を直接アップロードします。 // CRC 検証を有効化します。 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 は現在のスレッドの実行をブロックしますが、タスクの進行はブロックしません。 // [putTask waitUntilFinished];
ダウンロードにおけるデータ完全性チェック
OSS の iOS SDK は、ダウンロード時に 64 ビット CRC 値に基づいたエンドツーエンドのデータ完全性チェックを提供します。
CRC 検証が有効化されている場合、OSS はストリームからデータを読み取った後、自動的にデータ完全性をチェックします。
次のサンプルコードは、ダウンロード時に CRC 検証を有効化する方法の例です。
OSSGetObjectRequest * request = [OSSGetObjectRequest new];
request.bucketName = @"examplebucket";
request.objectKey = @"exampledir/exampleobject.txt";
// オブジェクトのダウンロード先のローカルパスを指定します。
request.downloadToFileURL = [NSURL fileURLWithPath:@"<filePath>"];
// CRC 検証を有効化します。
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";
// オブジェクトのダウンロード先のローカルパスを指定します。
request.downloadToFileURL = [NSURL fileURLWithPath:@"<filePath>"];
// CRC 検証を有効化します。
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 は現在のスレッドの実行をブロックしますが、タスクの進行はブロックしません。
// [task waitUntilFinished];