Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Schutz der Datenintegrität mit Prüfsummen
Amazon Simple Storage Service (Amazon S3) bietet die Möglichkeit, beim Hochladen eines Objekts eine Prüfsumme anzugeben. Wenn Sie eine Prüfsumme angeben, wird diese zusammen mit dem Objekt gespeichert und kann beim Herunterladen des Objekts überprüft werden.
Prüfsummen bieten eine zusätzliche Ebene der Datenintegrität bei der Übertragung von Dateien. Mit Prüfsummen können Sie die Datenkonsistenz überprüfen, indem Sie sicherstellen, dass die empfangene Datei mit der Originaldatei übereinstimmt. Weitere Informationen zu Prüfsummen mit Amazon S3 finden Sie im Amazon Simple Storage Service-Benutzerhandbuch, einschließlich der unterstützten Algorithmen.
Sie haben die Flexibilität, den Algorithmus auszuwählen, der Ihren Anforderungen am besten entspricht, und das SDK die Prüfsumme berechnen zu lassen. Alternativ können Sie mithilfe eines der unterstützten Algorithmen einen vorab berechneten Prüfsummenwert angeben.
Anmerkung
Ab Version 2.30.0 von bietet das SDK standardmäßige Integritätsschutzmaßnahmen AWS SDK for Java 2.x, indem es automatisch eine Prüfsumme für Uploads berechnet. CRC32 Das SDK berechnet diese Prüfsumme, wenn Sie keinen vorab berechneten Prüfsummenwert angeben oder wenn Sie keinen Algorithmus angeben, den das SDK zur Berechnung einer Prüfsumme verwenden soll.
Wir behandeln Prüfsummen in zwei Anforderungsphasen: beim Hochladen eines Objekts und beim Herunterladen eines Objekts.
Hochladen eines Objekts
Wenn Sie ein Objekt mit der putObject Methode hochladen und einen Prüfsummenalgorithmus bereitstellen, berechnet das SDK die Prüfsumme für den angegebenen Algorithmus.
Der folgende Codeausschnitt zeigt eine Anfrage zum Hochladen eines Objekts mit einer Prüfsumme. SHA256 Wenn das SDK die Anfrage sendet, berechnet es die SHA256 Prüfsumme und lädt das Objekt hoch. Amazon S3 validiert die Integrität des Inhalts, indem es die Prüfsumme berechnet und mit der vom SDK bereitgestellten Prüfsumme vergleicht. Amazon S3 speichert dann die Prüfsumme mit dem Objekt.
public void putObjectWithChecksum() { s3Client.putObject(b -> b .bucket(bucketName) .key(key) .checksumAlgorithm(ChecksumAlgorithm.SHA256), RequestBody.fromString("This is a test")); }
Wenn Sie mit der Anfrage keinen Prüfsummenalgorithmus angeben, variiert das Prüfsummenverhalten je nach der Version des verwendeten SDK, wie in der folgenden Tabelle dargestellt.
Prüfsummenverhalten, wenn kein Prüfsummenalgorithmus bereitgestellt wird
| Java-SDK-Version | Verhalten der Prüfsumme |
|---|---|
| früher als 2.30.0 | Das SDK berechnet nicht automatisch eine CRC-basierte Prüfsumme und gibt sie in der Anfrage an. |
| 2.30.0 oder später | Das SDK verwendet den |
Verwenden Sie einen vorberechneten Prüfsummenwert
Ein mit der Anfrage bereitgestellter vorberechneter Prüfsummenwert deaktiviert die automatische Berechnung durch das SDK und verwendet stattdessen den angegebenen Wert.
Das folgende Beispiel zeigt eine Anfrage mit einer vorberechneten Prüfsumme. SHA256
public void putObjectWithPrecalculatedChecksum(String filePath) { String checksum = calculateChecksum(filePath, "SHA-256"); s3Client.putObject((b -> b .bucket(bucketName) .key(key) .checksumSHA256(checksum)), RequestBody.fromFile(Paths.get(filePath))); }
Wenn Amazon S3 feststellt, dass der Prüfsummenwert für den angegebenen Algorithmus falsch ist, gibt der Service eine Fehlerantwort zurück.
Mehrteilige Uploads
Sie können Prüfsummen auch bei mehrteiligen Uploads verwenden.
Das SDK for Java 2.x bietet zwei Optionen zur Verwendung von Prüfsummen bei mehrteiligen Uploads. Die erste Option verwendet die. S3TransferManager
Das folgende Transfer-Manager-Beispiel spezifiziert den SHA1 Algorithmus für den Upload.
public void multipartUploadWithChecksumTm(String filePath) { S3TransferManager transferManager = S3TransferManager.create(); UploadFileRequest uploadFileRequest = UploadFileRequest.builder() .putObjectRequest(b -> b .bucket(bucketName) .key(key) .checksumAlgorithm(ChecksumAlgorithm.SHA1)) .source(Paths.get(filePath)) .build(); FileUpload fileUpload = transferManager.uploadFile(uploadFileRequest); fileUpload.completionFuture().join(); transferManager.close(); }
Wenn Sie bei der Verwendung des Transfer-Managers für Uploads keinen Prüfsummenalgorithmus angeben, berechnet das SDK automatisch eine Prüfsumme auf der Grundlage des Algorithmus. CRC32 Das SDK führt diese Berechnung für alle Versionen des SDK durch.
Die zweite Option verwendet die S3ClientAPIS3AsyncClientAPI
public void multipartUploadWithChecksumS3Client(String filePath) { ChecksumAlgorithm algorithm = ChecksumAlgorithm.CRC32; // Initiate the multipart upload. CreateMultipartUploadResponse createMultipartUploadResponse = s3Client.createMultipartUpload(b -> b .bucket(bucketName) .key(key) .checksumAlgorithm(algorithm)); // Checksum specified on initiation. String uploadId = createMultipartUploadResponse.uploadId(); // Upload the parts of the file. int partNumber = 1; List<CompletedPart> completedParts = new ArrayList<>(); ByteBuffer bb = ByteBuffer.allocate(1024 * 1024 * 5); // 5 MB byte buffer try (RandomAccessFile file = new RandomAccessFile(filePath, "r")) { long fileSize = file.length(); long position = 0; while (position < fileSize) { file.seek(position); long read = file.getChannel().read(bb); bb.flip(); // Swap position and limit before reading from the buffer. UploadPartRequest uploadPartRequest = UploadPartRequest.builder() .bucket(bucketName) .key(key) .uploadId(uploadId) .checksumAlgorithm(algorithm) // Checksum specified on each part. .partNumber(partNumber) .build(); UploadPartResponse partResponse = s3Client.uploadPart( uploadPartRequest, RequestBody.fromByteBuffer(bb)); CompletedPart part = CompletedPart.builder() .partNumber(partNumber) .checksumCRC32(partResponse.checksumCRC32()) // Provide the calculated checksum. .eTag(partResponse.eTag()) .build(); completedParts.add(part); bb.clear(); position += read; partNumber++; } } catch (IOException e) { System.err.println(e.getMessage()); } // Complete the multipart upload. s3Client.completeMultipartUpload(b -> b .bucket(bucketName) .key(key) .uploadId(uploadId) .multipartUpload(CompletedMultipartUpload.builder().parts(completedParts).build())); }
Der Code für die vollständigen Beispiele
Herunterladen eines Objekts
Wenn Sie die https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Client.html#getObject(software.amazon.awssdk.services.s3.model.GetObjectRequest)ChecksumMode enabled wenn die checksumMode Methode des Builders für auf gesetzt ist. GetObjectRequest ChecksumMode.ENABLED
Die Anfrage im folgenden Codeausschnitt weist das SDK an, die Prüfsumme in der Antwort zu validieren, indem es die Prüfsumme berechnet und die Werte vergleicht.
public GetObjectResponse getObjectWithChecksum() { return s3Client.getObject(b -> b .bucket(bucketName) .key(key) .checksumMode(ChecksumMode.ENABLED)) .response(); }
Anmerkung
Wenn das Objekt nicht mit einer Prüfsumme hochgeladen wurde, findet keine Überprüfung statt.
Andere Optionen zur Berechnung der Prüfsumme
Anmerkung
Um die Datenintegrität der übertragenen Daten zu überprüfen und etwaige Übertragungsfehler zu identifizieren, empfehlen wir Benutzern, die SDK-Standardeinstellungen für die Optionen zur Berechnung der Prüfsumme beizubehalten. Standardmäßig fügt das SDK diese wichtige Prüfung für viele S3-Operationen hinzu, einschließlich PutObject undGetObject.
Wenn Ihre Verwendung von Amazon S3 jedoch nur eine minimale Prüfsummenvalidierung erfordert, können Sie viele Prüfungen deaktivieren, indem Sie die Standardkonfigurationseinstellungen ändern.
Deaktivieren Sie die automatische Prüfsummenberechnung, sofern sie nicht erforderlich ist
Sie können die automatische Prüfsummenberechnung durch das SDK für Operationen deaktivieren, die sie unterstützen, z. B. PutObject und. GetObject Einige S3-Operationen erfordern jedoch eine Prüfsummenberechnung. Sie können die Prüfsummenberechnung für diese Operationen nicht deaktivieren.
Das SDK bietet separate Einstellungen für die Berechnung einer Prüfsumme für die Nutzlast einer Anfrage und für die Nutzlast einer Antwort.
In der folgenden Liste werden die Einstellungen beschrieben, die Sie verwenden können, um die Prüfsummenberechnungen in den verschiedenen Bereichen zu minimieren.
-
Geltungsbereich für alle Anwendungen — Wenn Sie die Einstellungen in Umgebungsvariablen oder in einem Profil in den gemeinsam genutzten AWS
configcredentialsDateien ändern, können alle Anwendungen diese Einstellungen verwenden. Diese Einstellungen wirken sich auf alle Service-Clients in allen AWS SDK-Anwendungen aus, sofern sie nicht im Anwendungs- oder Service-Client-Bereich außer Kraft gesetzt werden.-
Fügen Sie die Einstellungen zu einem Profil hinzu:
[default] request_checksum_calculation = WHEN_REQUIRED response_checksum_validation = WHEN_REQUIRED -
Umgebungsvariablen hinzufügen:
AWS_REQUEST_CHECKSUM_CALCULATION=WHEN_REQUIRED AWS_RESPONSE_CHECKSUM_VALIDATION=WHEN_REQUIRED
-
-
Aktueller Anwendungsbereich — Sie können die Java-Systemeigenschaft auf einstellen,
aws.requestChecksumCalculationWHEN_REQUIREDum die Prüfsummenberechnung einzuschränken. Die entsprechende Systemeigenschaft für Antworten ist.aws.responseChecksumValidationDiese Einstellungen wirken sich auf alle SDK-Dienstclients in der Anwendung aus, sofern sie nicht bei der Erstellung des Dienstclients außer Kraft gesetzt werden.
Stellen Sie die Systemeigenschaft zu Beginn Ihrer Anwendung ein:
import software.amazon.awssdk.core.SdkSystemSetting; import software.amazon.awssdk.core.checksums.RequestChecksumCalculation; import software.amazon.awssdk.core.checksums.ResponseChecksumValidation; import software.amazon.awssdk.services.s3.S3Client; class DemoClass { public static void main(String[] args) { System.setProperty(SdkSystemSetting.AWS_REQUEST_CHECKSUM_CALCULATION.property(), // Resolves to "aws.requestChecksumCalculation". "WHEN_REQUIRED"); System.setProperty(SdkSystemSetting.AWS_RESPONSE_CHECKSUM_VALIDATION.property(), // Resolves to "aws.responseChecksumValidation". "WHEN_REQUIRED"); S3Client s3Client = S3Client.builder().build(); // Use s3Client. } } -
Einzelner S3-Dienstclientbereich — Sie können einen einzelnen S3-Serviceclient so konfigurieren, dass er mithilfe von Builder-Methoden die Mindestanzahl an Prüfsummen berechnet:
import software.amazon.awssdk.core.checksums.RequestChecksumCalculation; import software.amazon.awssdk.services.s3.S3Client; public class RequiredChecksums { public static void main(String[] args) { S3Client s3 = S3Client.builder() .requestChecksumCalculation(RequestChecksumCalculation.WHEN_REQUIRED) .responseChecksumValidation(ResponseChecksumValidation.WHEN_REQUIRED) .build(); // Use s3Client. } // ... }
Verwenden Sie aus Gründen der LegacyMd5Plugin vereinfachten Kompatibilität MD5
Mit der Veröffentlichung des CRC32 Prüfsummenverhaltens in Version 2.30.0 hat das SDK die Berechnung von MD5 Prüfsummen für erforderliche Operationen eingestellt.
Wenn Sie ein veraltetes MD5 Prüfsummenverhalten für S3-Operationen benötigen, können Sie das verwendenLegacyMd5Plugin, das mit Version 2.31.32 des SDK veröffentlicht wurde.
Dies LegacyMd5Plugin ist besonders nützlich, wenn Sie die Kompatibilität mit Anwendungen aufrechterhalten müssen, die vom alten MD5 Prüfsummenverhalten abhängen, insbesondere wenn Sie mit S3-kompatiblen Speicheranbietern von Drittanbietern arbeiten, z. B. solchen, die mit S3A-Dateisystem-Konnektoren (Apache Spark, Iceberg) verwendet werden.
Um das zu verwendenLegacyMd5Plugin, fügen Sie es Ihrem S3-Client-Builder hinzu:
// For synchronous S3 client. S3Client s3Client = S3Client.builder() .addPlugin(LegacyMd5Plugin.create()) .build(); // For asynchronous S3 client. S3AsyncClient asyncClient = S3AsyncClient.builder() .addPlugin(LegacyMd5Plugin.create()) .build();
Wenn Sie den Vorgängen, die MD5 Prüfsummen erfordern, Prüfsummen hinzufügen und das Hinzufügen von SDK-Standardprüfsummen für Operationen, die Prüfsummen unterstützen, aber nicht erforderlich sind, überspringen möchten, können Sie die ClientBuilder Optionen und als aktivieren. requestChecksumCalculation responseChecksumValidation WHEN_REQUIRED Dadurch werden SDK-Standardprüfsummen nur für Operationen hinzugefügt, für die Prüfsummen erforderlich sind:
// Use the `LegacyMd5Plugin` with `requestChecksumCalculation` and `responseChecksumValidation` set to WHEN_REQUIRED. S3AsyncClient asyncClient = S3AsyncClient.builder() .addPlugin(LegacyMd5Plugin.create()) .requestChecksumCalculation(RequestChecksumCalculation.WHEN_REQUIRED) .responseChecksumValidation(ResponseChecksumValidation.WHEN_REQUIRED) .build();
Diese Konfiguration ist besonders nützlich, wenn Sie mit S3-kompatiblen Speichersystemen von Drittanbietern arbeiten, die die neueren Prüfsummenalgorithmen möglicherweise nicht vollständig unterstützen, aber dennoch Prüfsummen für bestimmte Operationen benötigen MD5 .