(57)【要約】レコード間改ざん検出コード検証部３６は、データベース３４から読み出そうとするレコードに格納されているレコード改ざん検出コードと、１つ前のレコードのレコード改ざん検出コードとをマージしたものに所定のハッシュ演算を施してレコード間改ざん検出コードを算出する。さらに、算出したレコード間改ざん検出コードと、読み出そうとするレコードに格納されているレコード間改ざん検出コードが一致するか否かを検証する。両者が一致する場合には、データの改ざんは行われていないと判定する。
2004068350.tif 000002
【特許請求の範囲】
【請求項１】
データ記憶部に所定の順序でデータを書き込む際に、今回書き込もうとするデータのデータ改ざん検出コードを算出し、
今回書き込もうとするデータの少なくとも１つ前のデータのデータ改ざん検出コードと、今回書き込もうとするデータのデータ改ざん検出コードとに基づいてデータ間改ざん検出コードを算出し、
今回書き込もうとするデータと前記データ改ざん検出コードと前記データ間改ざん検出コードとを対応ずけて前記データ記憶部に記憶させ、
前記データ記憶部に記憶されたデータを読み出す際に、読み出すべきデータのデータ改ざん検出コードを算出し、算出したデータ改ざん検出コードが、読み出すべきデータと対応づけて記憶されている前記データ改ざん検出コードと一致するか否かを検証し、
読み出すべきデータのデータ改ざん検出コードと少なくとも１つ前のデータのデータ改ざん検出コードとに基づいてデータ間改ざん検出コードを算出し、算出したデータ間改ざん検出コードが、読み出すべきデータと対応づけて記憶されているデータ間改ざん検出コードと一致する否かを検証することでデータの改ざんの有無を検出するデータ改ざん検出方法。
【請求項２】
データ記憶部に所定の順序でデータを書き込む際に、今回書き込もうとするデータの少なくとも１つ前のデータと今回書き込もうとするデータとに基づいてデータ間改ざん検出コードを算出し、
今回書き込もうとするデータと前記データ間改ざん検出コードとを対応ずけて前記データ記憶部に記憶させ、
前記データ記憶部に記憶されているデータを読み出す際に、読み出すべきデータと、該データの少なくとも１つ前のデータとに基づいてデータ間改ざん検出コードを算出し、算出したデータ間改ざん検出コードが、読み出すべきデータと対応づけて記憶されているデータ間改ざん検出コードと一致する否かを検証することでデータの改ざんの有無を検出するデータ改ざん検出方法。
【請求項３】
データ記憶部に所定の順序でデータを書き込む際に、今回書き込もうとするデータのレコード改ざん検出コードを算出し、
今回書き込もうとするレコードの少なくとも１つ前のレコードのレコード改ざん検出コードと、今回書き込もうとするデータのレコード改ざん検出コードとに基づいてレコード間改ざん検出コードを算出し、
今回書き込もうとするレコードに前記データと前記レコード改ざん検出コードと前記レコード間改ざん検出コードを書き込み、
前記データ記憶部からレコードを読み出す際に、読み出そうとするレコードのレコード改ざん検出コードを算出し、算出したレコード改ざん検出コードが、読み出そうとするレコードに記憶されているレコード改ざん検出コードと一致するか否かを検証し、
読み出そうとするレコードのレコード改ざん検出コードと、少なくとも１つ前のレコードのレコード改ざん検出コードとに基づいてレコード間改ざん検出コードを算出し、算出したレコード間改ざん検出コードが、読み出そうとするレコードに記憶されているレコード間改ざん検出コードと一致するか否かを検証することでデータの改ざんの有無を検出するデータ改ざん検出方法。
【請求項４】
データ記憶手段に書き込もうとするデータのデータ改ざん検出コードを算出するデータ改ざん検出コード算出手段と、
書き込もうとするデータの少なくとも１つ前のデータのデータ改ざん検出コードと、今回書き込もうとするデータのデータ改ざん検出コードとに基づいてデータ間改ざん検出コードを算出するデータ間改ざん検出コード算出手段と、
前記データと前記データ改ざん検出コードと前記データ間改ざん検出コードとを対応づけて前記前記データ記憶手段に書き込むデータ書き込み手段と、
前記データ記憶手段からデータを読み出すデータ読み出し手段と、
読み出されたデータのデータ改ざん検出コードを算出し、算出したデータ改ざん検出コードが、読み出されたデータと対応づけて記憶されているデータ改ざん検出コードと一致するか否かを検証するデータ改ざん検出コード検証手段と、
読み出されたデータのデータ改ざん検出コードと該データの少なくとも１つ前のデータのデータ改ざん検出コードとに基づいてデータ間改ざん検出コードを算出し、算出したデータ間改ざん検出コードが、読み出されたデータと対応づけて記憶されているデータ間改ざん検出コードと一致する否かを検証するデータ間改ざん検出コード検証手段とを備えるデータ改ざん検出装置。
【請求項５】
書き込もうとするデータと、該データの少なくとも１つ前のデータとに基づいてデータ間改ざん検出コードを算出するデータ間改ざん検出コード算出手段と、
書き込もうとするデータと前記データ間改ざん検出コードとを対応づけて前記前記データ記憶手段に書き込むデータ書き込み手段と、
前記データ記憶手段からデータを読み出すデータ読み出し手段と、
読み出されたデータと、該データの少なくとも１つ前のデータとに基づいてデータ間改ざん検出コードを算出し、算出したデータ間改ざん検出コードが、読み出されたデータと対応づけて記憶されているデータ間改ざん検出コードと一致する否かを検証するデータ間改ざん検出コード検証手段とを備えるデータ改ざん検出装置。
【請求項６】
データ記憶手段にデータを書き込むデータ書き込み手段と、
書き込もうとするデータのデータ改ざん検出コードを算出し、算出したデータ改ざん検出コードを、書き込もうとするデータと対応づけてデータ記憶手段に記憶させるデータ改ざん検出コード算出手段と、
書き込もうとするデータの少なくとも１つ前のデータのデータ改ざん検出コードと、前記データ改ざん検出コード算出手段により算出されたデータ改ざん検出コードとに基づいてデータ間改ざん検出コードを算出し、算出したデータ間改ざん検出コードを、書き込もうとするデータと対応づけて前記データ記憶手段に記憶させるデータ間改ざん検出コード算出手段と、
前記データ記憶手段からデータを読み出すデータ読み出し手段と、
読み出されたデータのデータ改ざん検出コードを算出し、算出したデータ改ざん検出コードが、読み出されたデータと対応づけて記憶されているデータ改ざん検出コードと一致するか否かを検証するデータ改ざん検出コード検証手段と、
読み出されたデータのデータ改ざん検出コードと該データの少なくとも１つ前のデータのデータ改ざん検出コードとに基づいてデータ間改ざん検出コードを算出し、算出したデータ間改ざん検出コードが、読み出されたデータと対応づけて記憶されているデータ間改ざん検出コードと一致する否かを検証するデータ間改ざん検出コード検証手段とを備えるデータ改ざん検出装置。
【請求項７】
データ記憶部に所定の順序でデータを書き込む際に、今回書き込もうとするデータと、該データの少なくとも１つ前のデータとに基づいてデータ間改ざん検出コードを算出し、
今回書き込もうとするデータと前記データ間改ざん検出コードとを対応ずけて前記データ記憶部に記憶させ、
前記データ記憶部に記憶されているデータを読み出す際に、読み出すべきデータと、該データの少なくとも１つ前のデータとに基づいてデータ間改ざん検出コードを算出し、算出したデータ間改ざん検出コードが、読み出すべきデータと対応づけて記憶されているデータ間改ざん検出コードと一致する否かを検証する処理をコンピュータに実行させるプログラム。
【請求項８】
データ記憶部に所定の順序でデータを書き込む際に、今回書き込もうとするデータのデータ改ざん検出コードを算出し、
今回書き込もうとするデータの少なくとも１つ前のデータのデータ改ざん検出コードと、今回書き込もうとするデータのデータ改ざん検出コードとに基づいてデータ間改ざん検出コードを算出し、
今回書き込もうとするデータと前記データ改ざん検出コードと前記データ間改ざん検出コードとを対応ずけて前記データ記憶部に記憶させ、
前記データ記憶部に記憶されたデータを読み出す際に、読み出すべきデータのデータ改ざん検出コードを算出し、算出したデータ改ざん検出コードが、読み出すべきデータと対応づけて記憶されている前記データ改ざん検出コードと一致するか否かを検証し、
読み出すべきデータのデータ改ざん検出コードと該データの少なくとも１つ前のデータのデータ改ざん検出コードとに基づいてデータ間改ざん検出コードを算出し、算出したデータ間改ざん検出コードが、読み出すべきデータと対応づけて記憶されているデータ間改ざん検出コードと一致する否かを検証する処理をコンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】  本発明は、データ記憶部に記憶されたデータの改ざん検出方法、データ改ざん検出装置及びデータ改ざん検出プログラムに関する。
【背景技術】  ネットワークの普及と共に、データベースに不正なアクセスが行われ、データが書き換えられる危険性が高くなっている。そのような不正なデータの改ざんを検出するために、例えば、図１６に示すようなデータ改ざん検出方法が考えられている。
図１６に示すデータ改ざん検出方法では、データ格納部１１がデータベース１３にログデータを書き込む際に、レコード改ざん検出コード算出部１２が、データに所定の演算を実行してレコード改ざん検出コードを算出し、そのレコード改ざん検出コードをデータに付加する。
データを読み出す際には、データ取り出し部１４が、該当するレコードをデータベース１３から読み出す。そして、レコード改ざん検出コード検証部１５が、読み出したデータに対して所定の演算を実行してレコード改ざん検出コードを算出し、その算出したレコード改ざん検出コードが、データに付加されているレコード改ざん検出コードと一致するか否かを検証し、データの改ざんが行われているか否かを判定している。
しかしながら、上記の改ざん検出方法では、レコードの追加、削除の改ざんを検出することができない。
レコードの追加、あるいは削除を検出するためには、特定のレコードの単位ごとに改ざん検出コードを設定する必要がある。例えば、図１７に示すように１〜１００番目までのデータレコード全体の改ざん検出コードを算出して記憶しておき、１番目から５番目までのレコードの追加、あるいは削除の改ざんの有無を確認したい場合には、１番目から１００番目までのデータレコード全体の改ざん検出コードを算出し、算出した改ざん検出コードが、記憶してある１番目から１００番目までのレコード全体の改ざん検出コードと一致するか否かを検証する必要がある。そのため、数件のレコードの改ざんの有無を確認する場合でも、１００件のデータレコードの改ざん検出コードを計算しなければならなず、データの改ざん検出処理に時間がかかるという問題点があった。
特開２００２−２５９２１６号公報（特許文献１）には、電子ファイルを送信する場合に、ファイル単位の完全性を検査するための記述子Ｈと、ファイル単位の連続性（前後のファイル単位が欠落していないか）を検査するための記述子Ｃを設けることが記載されている。
しかしながら、特許文献１に記載されている方法では、ファイル単位の構造が分かってしまうと、容易にファイル単位の連続性を検査するための記述子Ｃが作成できてしまうので、データの改ざんを防止することは難しい。
本発明の課題は、データの改ざん検出のための処理時間を増大させずに変更、追加、削除等のデータの改ざんを検出できるようにすることである。
【発明の開示】
本発明のデータ改ざん検出方法は、データ記憶部に所定の順序でデータを書き込む際に、今回書き込もうとするデータのデータ改ざん検出コードを算出し、今回書き込もうとするデータの少なくとも１つ前のデータのデータ改ざん検出コードと、今回書き込もうとするデータのデータ改ざん検出コードとに基づいてデータ間改ざん検出コードを算出し、今回書き込もうとするデータと前記データ改ざん検出コードと前記データ間改ざん検出コードとを対応ずけて前記データ記憶部に記憶させ、前記データ記憶部に記憶されたデータを読み出す際に、読み出すべきデータのデータ改ざん検出コードを算出し、算出したデータ改ざん検出コードが、読み出すべきデータと対応づけて記憶されているデータ改ざん検出コードと一致するか否かを検証し、読み出すべきデータのデータ改ざん検出コードと該データの１つ前のデータのデータ改ざん検出コードとに基づいてデータ間改ざん検出コードを算出し、算出したデータ間改ざん検出コードが、読み出すべきデータと対応づけて記憶されているデータ間改ざん検出コードと一致する否かを検証することでデータの改ざんの有無を検出する。
この発明によれば、少なくとも２つのデータのデータ改ざんコードからデータ間改ざん検出コードを算出し、データを読み出す場合に、そのデータ間改ざん検出コードを検証することで、データの変更、削除、追加等の改ざんを検出することができる。
また、データを改ざんするためには、少なくとも２つのデータのレコード改ざん検出コードと、１つのデータのレコード間改ざん検出コードを完全に作成する必要があるので、データの改ざんがその分困難になる。その結果として、データの改ざんをより正確に検出できる。
例えば、連続する複数のデータに対する改ざんを検出する場合に、対象となる個々のデータ間及び先頭のデータとその１つ前のデータとの間のデータ間改ざん検出コードを算出するだけで、対象となる複数のデータの変更、追加、削除等の改ざんを検出でき、それ以外のデータに対して改ざん検出コードの計算を行う必要がないので計算時間を短縮できる。
本発明の他のデータ改ざん検出方法は、データ記憶部に所定の順序でデータを書き込む際に、今回書き込もうとするデータと該データの少なくとも１つ前のデータとに基づいてデータ間改ざん検出コードを算出し、今回書き込もうとするデータと前記データ間改ざん検出コードとを対応ずけて前記データ記憶部に記憶させ、前記データ記憶部に記憶されているデータを読み出す際に、読み出すべきデータと、該データの少なくとも１つ前のデータとに基づいてデータ間改ざん検出コードを算出し、算出したデータ間改ざん検出コードが、読み出すべきデータと対応づけて記憶されているデータ間改ざん検出コードと一致する否かを検証することでデータの改ざんの有無を検出する。
この発明によれば、少なくとも２つのデータからデータ間改ざんコードを算出し、データを読み出す場合には、そのデータ間改ざん検出コードを検証することで、データの変更、削除、追加等の改ざんを検出することができる。この場合、データ間改ざん検出コードを算出すればよいので、改ざん検出コードの計算のための処理時間及び検証のための処理時間を短縮できる。また、２つのデータに基づいて改ざん検出コードを算出しているので、１つのデータから算出する場合に比べて改ざん検出コードを不正に作成するのが困難になる。
図１は、本発明のデータ改ざん検出装置の原理説明図である。本発明のデータ改ざん検出装置は、データ記憶手段２４に書き込もうとするデータのデータ改ざん検出コードを算出するデータ改ざん検出コード算出手段２１と、書き込もうとするデータの少なくとも１つ前のデータのデータ改ざん検出コードと、前記データ改ざん検出コードとに基づいてデータ間改ざん検出コードを算出するデータ間改ざん検出コード算出手段２２と、前記データと前記データ改ざん検出コードと前記データ間改ざん検出コードとを対応づけて前記前記データ記憶手段２４に書き込むデータ書き込み手段２３と、前記データ記憶手段２４からデータを読み出すデータ読み出し手段２５と、読み出されたデータのデータ改ざん検出コードを算出し、算出したデータ改ざん検出コードが、読み出されたデータと対応づけて記憶されているデータ改ざん検出コードと一致するか否かを検証するデータ改ざん検出コード検証手段２６と、読み出されたデータのデータ改ざん検出コードと該データの少なくとも１つ前のデータのデータ改ざん検出コードとに基づいてデータ間改ざん検出コードを算出し、算出したデータ間改ざん検出コードが、読み出されたデータと対応づけて記憶されているデータ間改ざん検出コードと一致する否かを検証するデータ間改ざん検出コード検証手段２７とを備える。
この発明によれば、少なくとも２つのデータの改ざん検出コードからデータ間改ざん検出コードを作成し、データを読み出す場合に、そのデータ間改ざん検出コードを検証することで、データの変更、削除、追加等の改ざんを検出することができる。
なお、データ改ざん検出コード算出手段２１とデータ間改ざん検出コード算出手段２２が、それぞれ作成したデータ改ざん検出コードとデータ間改ざん検出コードをデータ記憶手段に書き込むようにしてもよい。
【図面の簡単な説明】  図１は、本発明の説明図である。
図２は、第１の実施の形態のデータ改ざん検出方法の説明図である。
図３は、レコード改ざん検出コード算出部の処理を示すフローチャートである。
図４は、レコード間改ざん検出コード算出部の処理を示すフローチャートである。
図５は、データ格納部の処理を示すフローチャートである。
図６は、レコード改ざん検出コード検証部の処理を示すフローチャートである。
図７は、レコード間改ざん検出コード検証部の処理を示すフローチャートである。
図８は、データ取り出し部の処理を示すフローチャートである。
図９は、第２の実施の形態のデータ改ざん検出方法の説明図である。
図１０（Ａ）、（Ｂ）は、事前準備の処理のフローチャートである。
図１１は、レコード改ざん検出コードの算出処理のフローチャートである。
図１２は、レコード間改ざん検出コードの算出処理のフローチャートである。
図１３は、レコード改ざん検出コードの検証処理のフローチャートである。
図１４は、レコード間改ざん検出コードの検証処理のフローチャートである。
図１５は、公開鍵の検証処理のフローチャートである。
図１６は、従来のデータ改ざん検出方法の説明図（１）である。
図１７は、従来のデータ改ざん検出方法の説明図（２）である。
発明の実施をするための最良の形態
以下、本発明の実施の形態を図面を参照しながら説明する。図１は、本発明の第１の実施の形態のデータ改ざん検出方法の説明図である。なお、図１は、第１の実施の形態のデータ改ざん検出方法を適用したデータ改ざん検出装置の構成を示している。このデータ改ざん検出装置は、パーソナルコンピュータ等により実現できる。
データ格納部（データ書き込み手段）３１は、生成されたデータをデータベース（データ記憶部及びデータ記憶手段）３４に書き込む。
レコード改ざん検出コード算出部３２は、書き込もうとするデータ（現レコードのデータ）にハッシュ演算等の所定の演算を施しレコード改ざん検出コードを算出し、算出したレコード改ざん検出コードをレコード間改ざん検出コード算出部３３に出力する。また、レコード改ざん検出コード算出部３２は、算出したレコード改ざん検出コードをデータベース３４の現レコードに書き込む。
レコード間改ざん検出コード算出部３３は、現レコードの少なくとも１つ前（直前）のレコードのレコード改ざん検出レコードと、レコード改ざん検出コード算出部３２により算出されたレコード改ざん検出コードとに基づいてレコード間改ざん検出コードを算出する。
データベース３４の各レコードには、図２に示すように、データの順序（更新日時、順番など）を示すプライマリキーが格納されている。従って、このプライマリキーを検索することで、現レコードの１つ前のレコードを探すことができる。
上記のデータ格納部３１、レコード改ざん検出コード算出部３２及びレコード間改ざん検出コード算出部３３により、図２に示すようにデータベース３４の１つのレコードに、データと、レコード改ざん検出コードと、レコード間改ざん検出コードが格納される。
データを読み出す場合には、データ取り出し部（データ読み出し手段）３７は、該当するレコードのデータを読み出してレコード改ざん検出コード検証部３５に出力する。
レコード改ざん検出コード検証部３５は、読み出されたデータに所定の演算を施してレコード改ざん検出コードを算出し、算出したレコード改ざん検出コードが、読み出したレコードのレコード改ざん検出コードと一致するか否かを検証する。
レコード間改ざん検出コード検証部３６は、１つ前のレコードのレコード間改ざん検出コードと、読み出したレコードのレコード改ざん検出コードとに基づいてレコード間改ざん検出コードを算出し、算出したレコード間改ざん検出コードが、読み出したレコードのレコード間改ざん検出コードと一致するか否かを検証する。
データベース３４から読み出したデータに改ざんが加えられている場合には、上記の検証により、レコード改ざん検出コードまたはレコード間改ざん検出コードが一致しないと判定される。これにより、データの変更、削除、追加等の改ざん検出することができる。
なお、図２では、レコード改ざん検出コード算出部３２とレコード間改ざん検出コード算出部３３が、それぞれレコード改ざん検出コードと、レコード間改ざん検出コードをデータベース３４に書き込んでいるが、データ格納部３１が、レコード改ざん検出コード算出部３２とレコード間改ざん検出コード算出部３３からそれぞれ改ざん検出コードを受け取り、データ格納部３１がそれらの改ざん検出コードをデータベース３４に書き込むようにしても良い。
次に、上述した第１の実施の形態のレコード改ざん検出コード算出部３２、レコード間改ざん検出コード算出部３３、レコード改ざん検出コード検証部３５及びレコード間改ざん検出コード検証部３６等の処理を図３〜図６のフローチャートを参照して説明する。以下の処理は、データ改ざん検出装置のＣＰＵにより実行される。
先ず、レコード改ざん検出コード算出部３２の処理を、図３のフローチャートを参照して説明する。
レコード改ざん検出コード算出部３２は、書き込むべきデータ（現レコードのデータ）を取得する（図３，Ｓ１１）。
ステップＳ１１の処理では、例えば、データの書き込み要求が発生したときデータベース３４にレコードが作成され、同時にそのレコードにデータが書き込まれる場合には、データベース３４のそのレコードからデータを取得する。また、書き込むべきデータがデータ格納部３１に保持され、改ざん検出コードの算出が終了してから一緒にデータベース３４に書き込まれる場合には、データ格納部３１からデータを取得する。
次に、現レコードのデータのレコード改ざん検出コードを算出する（図３，Ｓ１２）。レコード改ざん検出コードの算出は、例えば、データに対して所定のハッシュ演算を行って改ざん検出コードを算出する。あるいは、データに対して何らかの演算を行って改ざん検出コードを算出し、その改ざん検出コードにハッシュ演算を施してメッセージダイジェストを作成する。そして、そのメッセージダイジェストをＲＳＡ（Ｒｉｖｅｓｔ−Ｓｈａｍｉｒ−Ａｄｌｅｍａｎ）暗号の秘密鍵により暗号化してデジタル署名を作成し、そのデジタル署名を改ざん検出コードとしてもよい。
そして、算出した改ざん検出コードをレコード改ざん検出コードとしてデータベース３４の該当するレコードに書き込む（図３，Ｓ１３）。
次に、レコード間改ざん検出コード算出部３３の処理を、図４のフローチャートを参照して説明する。
レコード間改ざん検出コード算出部３３は、書き込もうとするデータ（現レコードのデータ）のレコード改ざん検出コードを取得する（図４，Ｓ２１）。
次に、データを書き込もうとするレコードの１つ前のレコードのレコード改ざん検出コードをデータベース３４から取得する（図４，Ｓ２２）。各レコードには、データの順序（順番、あるいは更新日時など）を示すプライマリキーが書き込まれているので、そのプライマリキーにより１つ前のレコードを検索する。
次に、上記２つのレコード改ざん検出コードをマージしたものに対して所定の演算、例えばハッシュ演算を行い、あるいはデジタル署名を作成し、改ざん検出コードを算出する（図４，Ｓ２３）。
算出された改ざん検出コードをレコード間改ざん検出コードとしてデータベース３４の該当するレコードに書き込む（図４，Ｓ２３）。
次に、データ格納部３１の処理を図５のフローチャートを参照して説明する。
データベース３４に書き込もうとするデータが初回のデータか否かを判別する（図５，Ｓ３１）。
初回のデータであれば（Ｓ３１，ＹＥＳ）、ステップＳ３２に進、前レコードの改ざん検出コードを保持するレジスタをゼロクリアする。
初回のデータでなければ（Ｓ３１，ＮＯ）、ステップＳ３３に進み、現レコードに書き込むべきデータを取得する。なお、データを生成、あるいは取得した時点でレコードにデータを書き込む場合には、データを書き込んだレコードからデータを取得する。
次に、レコード改ざん検出コード算出部３２に現レコードのデータを渡し、レコード改ざん検出コード算出部３２からレコード改ざん検出コードを取得する（図５，Ｓ３４）。
次に、レコード間改ざん検出コード算出部３３に現レコードのレコード改ざん検出コードと、１つ前のレコードのレコードのレコード改ざん検出コードとを渡し、レコード間改ざん検出コード算出部３３からレコード間改ざん検出コードを取得する（図５，Ｓ３５）。
次に、データをデータベース３４の該当するレコードに書き込む（図５，Ｓ３６）。
そして、現レコードのレコード改ざん検出コードを、前レコードの改ざん検出コードとしてレジスタに記憶する（図５，Ｓ３７）。ステップＳ３７の処理は、連続してデータを書き込む場合に、次のデータのレコード間改ざん検出コードを算出するときに、１つ前のレコードのレコード改ざん検出コードをデータベース３４から検索する必要をなくすためである。
上述した図３〜図５の処理により、例えば、図２のｎ番目のレコードにデータを書き込む場合、先ず、書き込もうとするデータのレコード改ざん検出コードを算出する。次に、レジスタに記憶されている直前のレコードのレコード改ざん検出コードを取得し、あるいはプライマリキーにより１つ前のｎ−１番目のレコードを検索し、そのｎ−１番目のレコードに格納されているレコード改ざん検出コードを取得し、１つ前のレコードのレコード改ざん検出コードと、算出したレコード改ざん検出コードとに基づいてレコード間改ざん検出コードを算出する。そして、それらの改ざん検出コードをｎ番目のレコードに書き込む。これにより、ｎ番目のレコードには、データと共にレコード改ざん検出コードとレコード間改ざん検出コードが書き込まれる。
次に、レコード改ざん検出コード検証部３５の処理を、図６のフローチャートを参照して説明する。
読み出そうとするレコードのデータ（現レコードのデータ）を取得する（図６，Ｓ４１）。
次に、読み出そうとするレコードのデータに対して所定の演算、例えば、ハッシュ演算を行い改ざん検出コードを算出する（図６，Ｓ４２）。なお、データに対して所定のハッシュ演算を施したものをＲＳＡ暗号等のプライベート鍵により暗号化したデジタル署名を改ざん検出コードとして用いても良い。
次に、算出されたレコード改ざん検出コードが、読み出そうとするレコードに格納されているレコード改ざん検出コードと一致するか否かを検証する（図６，Ｓ４３）。
上記のレコード改ざん検出コード検証部３５の処理により、データベース３４から読み出したデータから算出したレコード改ざん検出コードと、そのレコードに格納されているレコード改ざん検出コードが一致するか否かが検証され、データの改ざんの有無を判定することができる。
次に、レコード間改ざん検出コード検証部３６の処理を、図７のフローチャートを参照して説明する。
レコード改ざん検出コード算出部３５から、現レコードのデータのレコード改ざん検出コードを取得する（図７，Ｓ５１）。
次に、レコードの順序を示すプライマリキーにより現レコードの１つ前のレコードを検索し、１つ前のレコードのレコード改ざん検出コードを取得する（図７，Ｓ５２）。
次に、現レコードと１つ前のレコードのレコード改ざん検出コードをマージしたものに対して所定のハッシュ演算を行い、レコード間改ざん検出コードを算出する（図７，Ｓ５３）。
次に、算出したレコード間改ざん検出コードが、現レコードのレコード間改ざん検出コードと一致するか否かを検証する（図７，Ｓ５４）。
上記のレコード間改ざん検出コード検証部３６の処理により、現レコードと、その１つ前のレコードのレコード改ざん検出コードからレコード間改ざん検出コードを算出し、その算出したレコード間改ざん検出コードが、現レコードに格納されているレコード間改ざん検出コードと一致するか否かを検証できる。これにより、レコードの削除、追加等の改ざんを検出できる。
次に、データ取り出し部３７の処理を、図８のフローチャートを参照して説明する。
データベース３４から取り出すレコード数の初期値として０を設定する（図８，Ｓ６１）。
次に、要求されたレコードのレコードデータ、レコード改ざん検出コード及びレコード間改ざん検出コードをデータベース３４から読み出す（図８，Ｓ６２）。
次に、レコード改ざん検出コード検証部３５にレコードデータとレコード改ざん検出コードを渡し、現レコードの改ざん検出コードの検証を行わせる（図８，Ｓ６３）。
次に、取り出しレコード数が０か否か、つまり要求されたレコードの先頭のレコードか否かを判別する（図８，Ｓ６４）。
レコード数が０のときには（Ｓ６４，ＹＥＳ）、ステップＳ６５に進み、現レコードのレコードデータ及びレコード改ざん検出コードを要求元に出力する。この場合、出力要求のあった先頭のレコードであるのでレコード間改ざん検出コードは出力しない。
他方、取り出しレコード数が０でないとき（Ｓ６４，ＮＯ）、すなわち出力要求のあったレコードの先頭のレコードではないときには、ステップＳ６６に進み、レコード間改ざん検出コード検証部３６に、現レコードのレコード改ざん検出コードと、レコード間改ざん検出コードと、１つ前のレコードのレコード改ざん検出コードを渡し、レコード間改ざん検出コードの検証を行わせる。
レコード改ざん検証部３５において、レコード改ざん検出コードが一致すると判定され、かつレコード間改ざんコード検証部３６において、レコード間改ざん検出コードが一致すると判定されたときには、現レコードのレコードデータと、レコード改ざん検出コードと、レコード間改ざん検出コードを要求元に出力する（図８，Ｓ６７）。
次に、取り出しレコード数を１増やし（図８，Ｓ６８）、現レコードのレコード改ざん検出コードを前レコードのレコード改ざん検出コードとしてレジスタに記憶する（図８，Ｓ６９）。
次に、要求された全てのレコードの出力が完了したか否かを判別する（図８，Ｓ７０）。
全てのレコードの出力が完了していなければ、ステップＳ６２に戻り、上述した処理を繰り返す。
上述した図６〜図８の処理により、例えば、図２のｎ番目以降のレコードのデータを読み出す場合に、ｎ番目のレコードについては、レコード改ざん検出コードのみを検証し、ｎ＋１番目のレコードのデータについては、ｎ＋１番目のデータからレコード改ざん検出コードを算出し、その算出したレコード改ざん検出コードが、ｎ＋１番目のレコードに格納されているレコード改ざん検出コードと一致するか否かを検証することで、そのレコードの改ざんの有無を検出することができる。さらに、ｎ＋１番目のレコードの１つ前のｎ番目のレコードのレコード改ざん検出コードと、ｎ＋１番目のレコードのレコード改ざん検出コードとに基づいてレコード間改ざんコードを算出し、算出したレコード間改ざん検出コードが、ｎ＋１番目のレコードに格納されているレコード間改ざん検出コードと一致する否かを検証することで、レコードの削除、追加、データの変更等の改ざんの有無を検出することができる。
上述した第１の実施の形態によれば、現レコードと１つ前のレコードのレコード改ざん検出コードとに基づいてレコード間改ざん検出コードを算出し、そのレコード間改ざん検出コードを現レコードに格納しておくことで、例えば、レコードの削除、追加等の改ざんを検出することができる。
また、少なくとも２つのレコードのレコード改ざん検出コードからレコードの削除、追加等の改ざんを検出することができるので、従来のように多数のレコードの改ざん検出コードから全体の改ざん検出コードを算出する方法に比べてデータの改ざんを検出するための処理時間を短縮できる。
さらに、改ざんではなく、あるレコードのデータに正規の変更を加えた場合にも、そのレコードの次のレコードのレコード間改ざん検出コードを再度算出するだけでよいので、改ざん検出コードの再計算に要する時間も短くてすむ。
次に、図９は、本発明の第２の実施の形態のデータ改ざん検出方法の説明図である。この第２の実施の形態は、公開鍵暗号を用いたデジタル署名により改ざん検出コードを作成するものである。
以下、図９の説明図及び図１０〜図１５のフローチャートを参照して説明する。以下の処理は、データ改ざん検出装置のＣＰＵにより実行される。
図１０（Ａ）、（Ｂ）は、公開鍵を導入または変更するとき、及び認証局から証明書破棄リストを取得する事前準備の処理内容を示すフローチャートである。
ＣＰＵは、公開鍵の導入直後、あるいは鍵変更時に、事前準備として図１０（Ａ）の処理を実行する。
先ず、公開鍵暗号のＲＳＡ（Ｒｉｖｅｓｔ−Ｓｈａｍｉｒ−Ａｄｌｅｍａｎ）鍵の秘密鍵と公開鍵のペアを作成し、保管する（図１０（Ａ）、Ｓ７１）。
次に公開鍵証明申請のため、公開鍵及び必要な情報を暗号化データの形式を定めたＰＫＣＳ＃１０形式で格納する（図１０（Ａ）、Ｓ７２）。
次に、認証局に対して証明書の発行依頼を送信する（図１０（Ａ）、Ｓ７３）。そして、認証局から証明書発行通知が届いたなら、公開鍵証明書、証明書パス及び証明書破棄リスト（ＣＲＬ：Ｃｅｒｔｉｆｉｃａｔｅ  Ｒｅｖｏｃａｔｉｏｎ  Ｌｉｓｔ）を取得する（図１０（Ａ）、Ｓ７４）。
また、定期的に図１０（Ｂ）のステップＳ７５の処理を実行し、認証局から最新の証明書破棄リストを取得する。
次に、データをデータベース３４のレコードに格納する場合に、レコード改ざん検出コードをデジタル署名により作成する場合の処理を図１１のフローチャートを参照して説明する。
図２のデータベース３４に書き込みたいデータにハッシュ演算の１つであるＳＨＡ−１（Ｓｅｃｕｒｅ  Ｈａｓｈ  Ａｌｇｏｒｉｔｈｍ−１）を適用しメッセージダイジェストを作成する（図１１，Ｓ８１）。
次に、作成したメッセージダイジェストを所定のフォーマットを満たすようにパディングし（ビットを付加し）、ＲＳＡ暗号のプライベート鍵（秘密鍵）を用いて暗号化してデジタル署名を作成する（図１１，Ｓ８２）。
次に、作成したデジタル署名、認証局から取得した公開鍵証明書、証明書パス及び証明書破棄リストをＰＫＣＳ＃７形式に格納して改ざん検出コードして図２のデータベース３４の該当するレコードに格納する。
上記のステップＳ８１〜Ｓ８３の処理により、図９に示すように、書き込もうとするデータに対してハッシュ演算ＳＨＡ−１を施しメッセージダイジェストを作成し、そのメッセージダイジェストをＲＳＡ暗号のプライベート鍵を用いて暗号化することでデジタル署名が作成される。そのデジタル署名に、所有者、公開鍵、発行者（認証局）及び発行者の署名とからなる公開鍵証明書と、ルート認証局までの間の認証局の公開鍵証明書からなる証明パスと、証明書破棄リストが付加され、ＰＫＣＳ＃７形式の改ざん検出コードが作成される。
次に、レコード間改ざん検出コードをデジタル署名により作成する場合について図１２のフローチャートを参照して説明する。
先ず、前述したレコード改ざん検出コード算出部３２等により算出される現レコードのレコード改ざん検出コードと、１つ前のレコードのレコード改ざん検出コードをマージする（図１２，Ｓ９１）。
次に、マージしたデータにハッシュ演算ＳＨＡ−１を行いメッセージダイジェストを作成する（図１２，Ｓ９２）。
次に、作成したメッセージダイジェストが所定のフォーマットを満たすようにパディングし、ＲＳＡ暗号の秘密鍵を用いて暗号化してデジタル署名を作成する（図１２，Ｓ９３）。
そして、作成したデジタル署名、認証局から取得した公開鍵証明書、証明書パス及び証明書破棄リストをＰＫＣＳ＃７形式に格納し、レコード間改ざん検出コードとする（図１２，Ｓ９４）。
上述した図１１及び図１２の処理により、デジタル署名によりレコード改ざん検出コードとレコード間改ざん検出コードが作成される。
次に、ＰＫＣＳ＃７形式のデジタル署名で作成されたレコード改ざん検出コードの検証方法を、図１３のフローチャートを参照して説明する。
データベース３４から読み出そうとするレコードのデータにハッシュ演算ＳＨＡ−１を適用しメッセージダイジェストを作成する（図１３，Ｓ１０１）。
次に、デジタル署名が行われた当時、署名者の公開鍵が有効だったことを検証する（図１３，Ｓ１０２）。この公開鍵の検証は、改ざん検出コードの証明書パスに格納されている認証局の公開鍵証明書に基づいて行う。この公開鍵の検証処理については後に説明する。
次に、レコード改ざん検出コード内のデジタル署名を、署名者の公開鍵（ＲＳＡ暗号の公開鍵）を用いて復号する（図１３，Ｓ１０３）。
次に、署名者の公開鍵で復号したデータの中のメッセージダイジェストが、レコードのデータから算出したレコード改ざん検出コードに対してハッシュ演算ＳＨＡ−１を適用して得られたメッセージダイジェストと一致するか、及びパディングが規定どおりか否かを検証する。なお、メッセージダイジェストに対するパディングは、ＰＫＣＳ＃７で定められた形式でデータが付加されるので、公開鍵で復号したデータからメッセージダイジェストを取り出すことができる。
上記の図１３の処理により、データベース３４から読み出そうとしているデータのレコード改ざん検出コードが、正規の署名者により作成されたものであることを確認できると共に、レコード改ざん検出コードに改ざんが加えられていないことが確認できる。レコード改ざん検出コードの検証は、レコードデータから算出したレコード改ざん検出コードのメッセージダイジェストとの比較により行っているので、レコードデータに対して改ざんが行われていないことも確認できる。
次に、デジタル署名により作成されたレコード間改ざん検出コードの検証方法を図１４のフローチャートを参照して説明する。
読み出そうとするレコードと、その１つ前のレコードのレコード改ざん検出コードをマージする（図１４，Ｓ１１１）。
次に、マージしたデータに対してハッシュ演算ＳＨＡ−１を適用してメッセージダイジェストを作成する（図１４，Ｓ１１２）。
次に、デジタル署名が行われた当時、署名者の公開鍵が有効だったことを検証する（図１４，Ｓ１１３）。
次に、レコード間改ざん検出コード内の署名を、そのレコード間改ざん検出コード内の公開鍵証明書から取り出した公開鍵で復号する（図１４，Ｓ１１４）。
次に、公開鍵で復号したデータの中のメッセージダイジェストと、現レコードと１つ前のレコードのレコード改ざん検出コードから算出したレコード間改ざん検出コードのメッセージダイジェストが一致するか、及び復号したデータのパディングが規定どおりか否かを検証する（図１４，Ｓ１１５）。
ステップＳ１１５の検証において、メッセージダイジェストが一致すると判定された場合には、ＰＫＣＳ＃７形式のレコード間改ざん検出コードの署名が公開鍵の所有者自身の署名であること、及び現レコードのレコード間改ざん検出コードが改ざんされていないことを確認できる。これにより、現レコードのデータが改ざんされていないことが証明される。
他方ステップＳ１１５の検証において、メッセージダイジェストが一致しないと判定されたときには、ＰＫＣＳ＃７形式のレコード間改ざん検出コードの署名が偽、またはデータの不正な削除、あるいは追加が行われた結果、レコード間改ざん検出コードが一致しない場合である。従って、ステップＳ１１５の検証により、レコードデータの削除、追加等の改ざんが行われたことを検出することができる。
次に、上述した図１３のステップＳ１０２及び図１４のステップＳ１１３の署名当時公開鍵が有効だったことを検証する処理を、図１５のフローチャートを参照して説明する。
ＰＫＣＳ＃７形式のレコード改ざん検出コードまたはレコード間改ざん検出コードに格納されている公開鍵証明書がチェック済みの公開鍵証明書か否かを判別する（図１５，Ｓ１２１）。チェック済みの公開鍵証明書であれば（Ｓ１２，ＹＥＳ）、ステップＳ１３１に進み前回のチェック結果を返す。
チェック済みの公開鍵証明書ではない場合には（Ｓ１２１，ＮＯ）、ステップＳ１２３に進み、その公開鍵証明書が最新の証明書破棄リスト（ＣＲＬ）に登録されていないことを確認する。そして、その公開鍵証明書が証明書破棄リストに登録されていないかどうかを判別する（図１５，Ｓ１２４）。
公開鍵証明者に格納されている公開鍵が証明書破棄リストに登録されていない場合には（Ｓ１２４，ＹＥＳ）、ステップＳ１２５に進み、証明書パスの中の最初の公開鍵証明書から発行者（第１階層の認証局）の署名以外の部分のデータを取り出し、そのデータから所定のアルゴリズムでメッセージダイジェストを作成する（図１５，Ｓ１２５）。
次に、証明書パスの最初の公開鍵証明書の中の発行者（認証局）のデジタル署名を、公開鍵証明書の中の認証局の公開鍵を用いて復号する（図１５，Ｓ１２６）。
認証局の公開鍵を用いて復号したデータの中のメッセージダイジェストと、公開鍵証明書のデータから所定のアルゴリズムで作成したメッセージダイジェストが一致するか、及びパディングが規定どおりか否かを検証する（図１５，Ｓ１２７）。そして、検証結果がＯＫ、つまりメッセージダイジェストが一致したか否かを判別する（図１５，Ｓ１２８）。
メッセージダイジェストが一致し、検証がＯＫだった場合には（Ｓ１２８，ＹＥＳ）、ステップＳ１２９に進み認証局がルート認証局（最上位の認証局）か否かを判別する。
認証局がルート認証局ではないときには（Ｓ１２９，ＮＯ）、ステップＳ１３０に進み、認証パスを遡り、上位の認証局を検証するために証明書パスの次の公開鍵証明書を取得する。その後、ステップＳ１２３に戻り、上述したステップＳ１２３〜Ｓ１３０の処理を繰り返す。
先ず、ステップＳ１２３及びＳ１２４において、データの作成者の公開鍵証明書を発行した認証局の公開鍵が証明書破棄リストに登録されていないことを確認し、ステップＳ１２５において、証明書パスのその認証局の公開鍵証明書の署名以外の部分のデータからメッセージダイジェストを作成する。さらに、その公開鍵証明書の中の署名を、公開鍵証明書の発行者である上位の認証局の公開鍵で復号し、復号したデータの中のメッセージダイジェストと、作成したメッセージダイジェストが一致するか否かを検証する。両者が一致すれば、署名者である下位の認証局が、上位の認証局により保証される。以下、同様の処理を繰り返すことにより、証明書パスを遡り、ルート認証局に達した時点で、改ざん検出コードの署名者の公開鍵が有効であったことを確認できる。
上記のステップＳ１２３〜Ｓ１３０の処理により、改ざん検出コード（レコード改検出コード及びレコード間改ざん検出コード）の署名者の公開鍵が、署名当時認証局により保証された有効なものであったことが確認できる。
上述した第２の実施によれば、改ざん検出コード（レコード間改ざん検出コードとレコード間改ざん検出コードを含む）をデジタル署名により作成してデータと共に格納しておき、データを読み出す際に、レコード改ざん検出コード及びレコード間改ざん検出コードに格納されている署名者の公開鍵により復号し、データから作成したレコード改ざん検出コード及び現レコード及び１前のレコードのレコード改ざん検出コードから作成したレコード間改ざん検出コードのメッセージダイジェストと比較することで、それらの改ざん検出コードに対する改ざんの有無を判定することができる。これにより、データに対する改ざんの有無を確実に検出することができる。
また、この第２実施の形態では、改ざん検出コードの公開鍵証明書の公開鍵を用いて改ざん検出コードの検証を行うことができるので、データベース３４を作成する人以外の人も改ざん検出コードの検証を行うことができる。
また、ＲＳＡ暗号のデジタル署名を用いているので、改ざん検出コードを不正に作成することが困難になる。
本発明は、以下のように構成してもよい。
（１）レコード形式のデータに限らず、形式の定められていない任意のデータ、あるいはファイル等にも適用できる。
（２）１つ前のレコード（データ）の改ざん検出コードと現レコードの改ざん検出コードからレコード間改ざん検出コードを算出する方法に限らず、現レコードの１つ前レコードと２つ前のレコード、あるいは１つ前と２つ前と３つ前・・・というように２以上の複数のレコードの情報（改ざん検出コード以外でもよい）に基づいてレコード間改ざん検出コードを算出しても良い。
（３）１つ前のレコードの改ざん検出コードと現レコードの改ざん検出コードをマージしてレコード間改ざん検出コードを算出する方法に限らず、レコード改ざん検出コードを作成せず、少なくとも１つ前のデータと現レコードのデータとに基づいてレコード間改ざん検出コードを算出してもよい。
（４）データを記憶するデータベース３４は、必ずしもデータ改ざん検出装置の内部にある必要はなく、ネットワークを介して接続された別のデータ記憶装置であってもよい。
本発明によれば、データを書き込む場合に、１つ前のデータと書き込もうとするデータに基づいてデータ間改ざん検出コードを作成することで、データの変更、削除、追加の改ざんを処理時間を増大させずに検出することができる。
【図１】
2004068350.tif 000003
【図２】
2004068350.tif 000004
【図３】
2004068350.tif 000005
【図４】
2004068350.tif 000006
【図５】
2004068350.tif 000007
【図６】
2004068350.tif 000008
【図７】
2004068350.tif 000009
【図８】
2004068350.tif 000010
【図９】
2004068350.tif 000011
【図１０】
2004068350.tif 000012
【図１１】
2004068350.tif 000013
【図１２】
2004068350.tif 000014
【図１３】
2004068350.tif 000015
【図１４】
2004068350.tif 000016
【図１５】
2004068350.tif 000017
【図１６】
2004068350.tif 000018
【図１７】
2004068350.tif 000019
【国際調査報告】
2004068350.tif 000020
2004068350.tif 000021
2004068350.tif 000022
2004068350.tif 000023