Le SDK Object Storage Service (OSS) pour iOS propose des vérifications d'intégrité des données afin de garantir leur sécurité lors des opérations de chargement et de téléchargement.
Vérifications d'intégrité des données lors du chargement
En raison de la complexité des réseaux mobiles, des erreurs peuvent survenir lors du transfert de données entre le client et le serveur. OSS offre des vérifications d'intégrité des données de bout en bout basées sur les algorithmes MD5 et CRC-64.
-
Vérification MD5
Si vous spécifiez l'en-tête Content-MD5 dans la requête lors du chargement d'un objet, OSS effectue une vérification MD5 sur cet objet pour assurer son intégrité. L'objet n'est chargé que si le hachage MD5 de l'objet reçu correspond à la valeur Content-MD5 indiquée dans la requête.
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]; -
Vérification CRC
La valeur CRC 64 bits d'un objet peut être calculée pendant son chargement. L'exemple de code suivant illustre comment effectuer une vérification CRC lors du chargement d'un objet :
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];
Vérifications d'intégrité des données lors du téléchargement
Le SDK OSS pour iOS propose des vérifications d'intégrité des données de bout en bout basées sur des valeurs CRC 64 bits lors des téléchargements.
Si la vérification CRC est activée, OSS contrôle automatiquement l'intégrité des données après avoir lu les données depuis un flux.
L'exemple de code suivant montre comment activer la vérification CRC lors des téléchargements :
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];
Si le bloc onReceiveData est défini, vous devez vérifier que la valeur CRC est identique.
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];