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];