マイナンバー制度における「チェックディジット」の役割

2015年8月31日
いよいよ、後1か月。。。

日本でも個人番号制度「マイナンバー制度」が始まる(2015年10月5日)。当ブログでも『個人番号の収集プロセス』について、いくつかのワークフロー(業務プロセス)を例示してきた。

そして、次週以降は「法人番号」の利活用についても、その事例を紹介していく予定となっている。法人番号システム『Web-API 機能』の活用事例についても、「事前検証環境」にて動作確認でき次第、順次公開していく予定だ。


今回は「マイナンバー」を取り扱う業務でかかせない「誤り検出」についてまとめておく。
以下のワークフロー定義は、入力データの「正確性チェック」を体験できるサンプルだ。[1] 入力中データが自動的にチェックされる仕組み(入力画面での JavaScript)と、[2] サーバ側にてデータチェックされる仕組み(スクリプト工程での JavaScript)の両方が設定されている。

なお、チェックディジットとは「検査用文字」という意味だ。『クレジットカード番号』や『商品コード』(EAN/JANバーコード)や『国際標準図書番号』(ISBN)などでも幅広く活用されている。日本の『マイナンバー』の場合は、
  • 法人番号(13桁数字): 左端の数字
  • 個人番号(12桁数字): 右端の数字
が「一定の計算式」によって算出され、付加されている。

[Check Digit サンプル:「TEST Form」画面]


[Check Digit サンプル]

この例では、まず『データ入力画面』において、リアルタイムに入力値がチェックされる。(法人番号1・個人番号1)

すなわち「法人番号(13桁)」や「個人番号(12桁)」が入力された瞬間、ブラウザ側の処理(JavaScript 処理)によって「検査用数字」が計算され、検査用文字との照合が行われている。単純な入力ミスであれば、この瞬間に気づくだろう。


また、『スクリプト工程』でのチェックも設定されている。(法人番号2・個人番号2)

これは、別システムから法人番号を受信した場合など、サーバ側で改めて検査/検証すべきケースに有用だ。むろん、別システム側が既に検査していた場合は「無駄な計算」となってしまう可能性もあるが、わずかな計算量であり大きな問題ではない。(「入力画面チェック」と組み合わせても良い)


いずれのケースも、「誤りデータ」を自動的に検知できる仕組みだ。

実際に入力体験してみると実感できるが、「誤入力」は極めて難しい。13桁/12桁のうち2か所以上を間違える必要があるが、すべての誤入力(入力ミス)は検知されるだろう。行政手続書類を作成するワークフローには、積極的に組み込んでいきたい。「呼び出し対応」や「再申請」といった手間を排除できる。延いては、行政コストの削減にもつながる。

◆◆法人番号チェック
※ 「法人番号」は13ケタの数字で構成される。先頭文字(左端)がチェックディジットである。

◆入力画面でのスクリプト設定(法人番号)
<script type="text/javascript">
jQuery('input[name="data[1].input"]').on('keydown keyup keypress change',function(){ 
//データ項目番号「1」のTextフォーム値に変化があれば、
var thisValueLength = jQuery(this).val().length;

//文字数が13桁ならチェックディジットを算出
if( thisValueLength == 13 ){
  var mysum = 0;
  var thisValue = jQuery(this).val();

// for( i=1; i<13; i++){
// mysum += parseInt( thisValue.charAt(i) ) * (i % 2 + 1);
// }

  mysum += parseInt( thisValue.charAt(1) ) * 2; 
  mysum += parseInt( thisValue.charAt(2) ); 
  mysum += parseInt( thisValue.charAt(3) ) * 2; 
  mysum += parseInt( thisValue.charAt(4) ); 
  mysum += parseInt( thisValue.charAt(5) ) * 2; 
  mysum += parseInt( thisValue.charAt(6) ); 
  mysum += parseInt( thisValue.charAt(7) ) * 2; 
  mysum += parseInt( thisValue.charAt(8) ); 
  mysum += parseInt( thisValue.charAt(9) ) * 2; 
  mysum += parseInt( thisValue.charAt(10) ); 
  mysum += parseInt( thisValue.charAt(11) ) * 2; 
  mysum += parseInt( thisValue.charAt(12) ); 

  var checkdigitnum = 9 - mysum % 9;
  var typedcd = parseInt( thisValue.charAt(0) );

//#mymessage1のHTMLを書き換える
  if( typedcd == checkdigitnum ){
    jQuery( '#mymessage1' ).html("OK");
  } else {
    jQuery( '#mymessage1' ).html("<font color=red>NG</font>");
  }
} else {
  jQuery( '#mymessage1' ).html("<font color=blue>13桁の数字を入力してください</font>");
}
});
</script>

◆自動工程でのスクリプト検査(法人番号)
//// == 参照 / Retrieving ==
var mynumber = data.get("3") + ""; 

//// == 演算 / Calculating ==
if( mynumber == "null" ){
  retVal.put("4", "(null)" );
}else if( mynumber.length == 13 ){
  var mysum = 0;

  for( i=1; i<13; i++){
    mysum += parseInt( mynumber.charAt(i) ) * (i % 2 + 1);
  }

  var checkdigitnum = 9 - mysum % 9;
  var typedcd = parseInt( mynumber.charAt(0) );

//// == 代入 / Updating ==
  if( typedcd == checkdigitnum ){
    retVal.put("4", "OK" ); 
  } else {
    retVal.put("4", "Check-Digit ERROR" ); 
  }
} else {
  retVal.put("4", "Number of digits ERROR" ); 
}

◆◆個人番号チェック
※ 「個人番号」は12ケタの数字で構成される。末尾文字(右端)がチェックディジットである。

◆入力画面でのスクリプト設定(個人番号)
<script type="text/javascript">
jQuery('input[name="data[7].input"]').on('keydown keyup keypress change',function(){ 
//データ項目番号「7」のTextフォーム値に変化があれば、
var thisValueLength = jQuery(this).val().length;

//文字数が12桁ならチェックディジットを算出
if( thisValueLength == 12 ){
  var mysum = 0;
  var thisValue = jQuery(this).val();
  for( i=0; i<5; i++){
    mysum += (11 - i - 5) * parseInt( thisValue.charAt(i) );
  }
  for( i=5; i<11; i++){
    mysum += (11 - i + 1) * parseInt( thisValue.charAt(i) );
  }
  var checkdigitnum = 11 - mysum % 11;
  if( checkdigitnum > 9 ){ checkdigitnum = 0; }
  var typedcd = parseInt( thisValue.charAt(11) );

//#mymessage7のHTMLを書き換える
  if( typedcd == checkdigitnum ){
    jQuery( '#mymessage7' ).html("OK");
  } else {
    jQuery( '#mymessage7' ).html("<font color=red>NG</font>");
  }
} else {
  jQuery( '#mymessage7' ).html("<font color=blue>12桁の数字を入力してください</font>");
}
});
</script>

◆自動工程でのスクリプト設定(個人番号)
//// == 参照 / Retrieving ==
var mynumber = data.get("8") + "";

//// == 演算 / Calculating ==
if( mynumber == "null" ){
  retVal.put("9", "(null)" );
}else if( mynumber.length == 12 ){
  var mysum = 0;
  for( i=0; i<5; i++){
    mysum += parseInt( mynumber.charAt(i) ) * (11 - i - 5);
  }
  for( i=5; i<11; i++){
    mysum += parseInt( mynumber.charAt(i) ) * (11 - i + 1);
  }
  var checkdigitnum = 11 - mysum % 11;
  if( checkdigitnum > 9 ){ checkdigitnum = 0; }
  var typedcd = parseInt( mynumber.charAt(11) );

//// == 代入 / Updating ==
  if( typedcd == checkdigitnum ){
    retVal.put("9", "OK" ); 
  } else {
    retVal.put("9", "Check-Digit ERROR" ); 
  }
} else {
  retVal.put("9", "Number of digits ERROR" ); 
}

<データ項目一覧画面>


[雛形ダウンロード (無料)]
<類似プロセス>
≪関連記事≫

[英文記事(English Entry)]

0 件のコメント :

コメントを投稿