データの整合性を確認します

HERE platform は、パーティションレベルでデータの整合性を確保するための標準的な方法を提供します。 すべてのレイヤタイプのレイヤ設定では、ダイジェスト(チェックサム)と CRC の 2 つのオプションフィールドがサポートされています。

ダイジェストと CRC は 2 つの異なる要素です。 ダイジェストは、人間による改ざんを防止するためのセキュリティに使用されます。 CRC は、コンピューターのハードウェアまたはネットワークの輸送によってビットが反転するのを防ぐために安全に使用されます。 両方のフィールドを同時に使用できます。

ダイジェスト

パーティションを取得するときに、アプリケーションはパーティション データが人間によって改ざんされていないかどうかを確認できます。 そのためには、アプリケーションがデータのチェックサムを計算し、パーティションに含まれているチェックサム(ダイジェスト)と比較する必要があります。 これらの 2 つのチェックサム値が一致する場合、取得されたデータはアップロードされたパーティションと整合しています。 データ クライアント ライブラリにはダイジェスト計算のアルゴリズムが組み込まれているため、アプリケーションで使用する必要があります。

デフォルトでは、パーティションにはチェックサムが含まれていません。 レイヤ設定でチェックサムアルゴリズムを明示的に選択する必要があります。 レイヤー設定のチェックサム設定が「未定義」でない場合、データ クライアント ライブラリはパーティションをアップロードする前に、選択したアルゴリズムを使用して自動的にチェックサムを計算します。

ダイジェストアルゴリズムを選択する場合は、次の点を考慮してください。

  • 強力なデータセキュリティが必要なアプリケーションには、 SHA-256 を推奨します。
  • ハッシュを適用する目的が転送中のデータの整合性を確認することである場合、 MD5 および SHA-1 は許容されます。

CRC

パーティションを取得する際、アプリケーションは、コンピューターのハードウェアまたはネットワークの転送によってパーティション データの 1 つ以上のビットが反転されたかどうかを確認できます。 そのためには、アプリケーションがデータの CRC を計算し、パーティションに含まれている CRC と比較する必要があります。 これらの 2 つの CRC 値が一致する場合、取得されたデータはアップロードされたパーティションと整合しています。 データ クライアント ライブラリには CRC 計算のためのアルゴリズムが組み込まれているため、アプリケーションはこれらのアルゴリズムを使用する必要があります。

デフォルトでは、パーティションには CRC が含まれていません。 レイヤ設定で CRC アルゴリズムを明示的に選択する必要があります。 レイヤー・コンフィグレーションの CRC 設定が「なし」でない場合、データ クライアント ライブラリはパーティションのアップロード前に、選択したアルゴリズムを使用して自動的に CRC を計算します。

現在サポートされている CRC アルゴリズムは 1 つだけです。

  • CRC-32C ( Castagnoli )。 : CRC アルゴリズムを参照。

    この CRC は 0 で埋められ、 8 文字の固定長になります。 また、 CRC は文字列として保存されます。たとえば、計算された CRC が uint32 の値 0x1234af である場合、実際にパーティション メタデータに保存されている CRC は文字列「 001234af 」になります。

詳細情報

考えられるダイジェストおよび CRC アルゴリズムの詳細について は、 Data API リファレンス のアップデート・カタログを参照してください。 HERE では、他のレイヤータイプについての設定情報も参照できます。

ブロブのチェックサム値を計算し ' 次のように新しいパーティションに関連付けることができます

Scala
Java
val bufferedBlob: BufferedBlob = ByteArrayData(Array.emptyByteArray)

val writeEngine = DataEngine().writeEngine(hrn)

val blobChecksum: Future[Option[String]] =
  writeEngine.blobChecksum(layerName, bufferedBlob)

val singlePartition = Source
  .fromFuture(blobChecksum)
  .map(checksum => NewPartition("12345", layerName, bufferedBlob, checksum = checksum))

writeEngine.publish(singlePartition)
BufferedBlob bufferedBlob = new ByteArrayData(new byte[] {});

WriteEngine writeEngine = DataEngine.get(myActorSystem).writeEngine(hrn);

CompletionStage<Optional<String>> blobChecksum =
    writeEngine.blobChecksum(layerName, bufferedBlob);

Source<PendingPartition, NotUsed> singlePartition =
    Source.fromCompletionStage(blobChecksum)
        .map(
            checksum ->
                new NewPartition.Builder()
                    .withPartition("12345")
                    .withLayer(layerName)
                    .withData(bufferedBlob)
                    .withChecksum(checksum)
                    .build());

writeEngine.publish(singlePartition);

パーティションを取得し、そのチェックサムを次のコードで確認できます。

Scala
Java
val dataEngine = DataEngine()
val readEngine = dataEngine.readEngine(hrn)
val writeEngine = dataEngine.writeEngine(hrn)

val blobChecksum: Future[Option[String]] = readEngine
  .getDataAsBytes(partition)
  .flatMap(bytes => writeEngine.blobChecksum(layerName, ByteArrayData(bytes)))

blobChecksum.map(checksum => checksum == partition.checksum)
DataEngine dataEngine = DataEngine.get(myActorSystem);
WriteEngine writeEngine = dataEngine.writeEngine(hrn);
ReadEngine readEngine = dataEngine.readEngine(hrn);

CompletionStage<Optional<String>> blobChecksum =
    readEngine
        .getDataAsBytes(partition)
        .thenCompose(bytes -> writeEngine.blobChecksum(layerName, new ByteArrayData(bytes)));

blobChecksum.toCompletableFuture().get().equals(partition.getChecksum());

」に一致する結果は 件です

    」に一致する結果はありません