マイナンバーと向き合ってみた

本記事は アプレッソ Advent Calendar 2015 の 22 日目の記事です。

qiita.com

はじめに

こんにちは

マイナンバーでゾロ目番号ゲット♪ の kintaniiis です。

って。。。いきなり嘘をつきました。
実際はまったく違う番号です。ホントすみません。m(_ _)m

というのも、世間では何かと話題になっているこのマイナンバー (個人番号)、マイナンバーの場合は 12 桁の数字で構成されていて、その最後の桁である 12 桁目はチェックディジット (check digit) と呼ばれる値になっています。

 マイナンバーの例 : 12345678901[2] ここがマイナンバーのチェックディジット! 

このチェックディジットの値は、1 ~ 11 桁までの値がマイナンバーとして正しい値なのかどうかを検査するための値なんです。
決められた算式によって得られた結果と、このチェックディジットの値が同じであれば、その値は正しいものであるということがわかる仕組みになっているんですね。

 マイナンバー検査用算式の結果 = チェックディジットの値 → 正しいマイナンバー!

入力ミスを検出する目的ですので、算式などは異なりますがチェックディジットの仕組み自体はバーコードや銀行口座番号、クレジットカード番号など我々の生活のなかにも幅広く使用されてます。

今回は、このマイナンバーの検査用算式を調べて、折角ですから値のチェックを行う処理を実装していきたいと思います。
冒頭で、マイナンバーでゾロ目番号ゲット♪ → すごーい!と思った方には特にお勧めします。
尚、私が普段少しだけ関わっています、ノンコーディングでとても簡単にデータ連携処理が構築できる「DataSpider Servista」という EAI 製品を使用して、チェック処理を実装していきたいと思います。

 

マイナンバー検査用算式について調べてみる

総務省が定めたマイナンバーの検査用数字を算出する算式は、以下となっています。

[総務省令第八十五号資料]

総務省令第八十五号の第五条より抜粋

f:id:kintani:20151217110023p:plain

 ① について

まず、いきなり最初の数式で出ばなをくじかれました。「Σ」シグマの記号はどんな意味なのでしょうか。高校とかで習いましたっけ?まったく覚えていません。汗
調べてみると、n には 1 ~ 11 を代入して Pn × Qn を計算し、その総和を求めるという意味のようです。

  1. (P1 × Q1) + (P2 × Q2) + (P3 × Q3) + (P4 × Q4) + (P5 × Q5) + (P6 × Q6) + (P7 × Q7) + (P8 × Q8) + (P9 × Q9) + (P10 × Q10) + (P11 × Q11)
  2. (1 の結果) / 11 の余り
  3. 11 - (2 の結果)

② について

(1 の結果) / 11 の余りが 1 以下なら「0」にしてくださいとのこと。

③ について

Pn は、12 桁目であるチェックディジットを除いた 11 桁の最下位 (右桁) からの数字とのこと。

マイナンバーの例 : 123456789012

P11P10P9P8P7P6P5P4P3P2P1check digit
1 2 3 4 5 6 7 8 9 0 1 2

④ について

Qn は、値に依存せずにどんなマイナンバーでも決まった値になりますね。

  • n が 1 以上 6 以下であれば n + 1
  • n が 7 以上 11 以下であれば n - 5
Q1Q2Q3Q4Q5Q6Q7Q8Q9Q10Q11
1+1 2+1 3+1 4+1 5+1 6+1 7-5 8-5 9-5 10-5 11-5
2 3 4 5 6 7 2 3 4 5 6

 

なるほどです。はじめは難解に思ってましたが、こうやって順序立てて見てみると怖くなくなりました。よって以下のマイナンバーでは、このような結果になります。

マイナンバーの例 : 123456789012

  1. (1 × 2) + (0 × 3) + (9 × 4) + (8 × 5) + (7 × 6) + (6 × 7) + (5 × 2) + (4 × 3) + (3 × 4) + (2 × 5) + (1 × 6) = 212
  2. 212 / 11 の余りは 3
  3. 11 - 3 = 8

算式の結果「8」は、チェックディジットの値「2」と異なるため、このマイナンバーは正しい値ではないという結果になります。

 

いざ!実装へ

マイナンバーの仕組みと値のチェック方法がわかったところで、「DataSpider Servista」を使用してチェック処理を実装していきたいと思います。

最終的には、Excel シートに記載のマイナンバーを読み込んで、それが正しい値かどうかの判定結果を Excel シートに書き込むような処理にしていきます。

 

1. 他のスクリプトでも使用できるように、ユーザ定義ロジックを作成します。
2. ユーザ定義ロジックで、まずは大まかな部分を定義していきます。

  • 入力ハンドラからはマイナンバーが入り、出力ハンドラへはマイナンバーの正否判定結果を真偽値 (true または false) で出力します。
  • 正規表現にマッチ」ロジックを使用し、12 桁の数値でなければ「false」を返します。
  • 「途中文字列」ロジックを使用し、チェックディジットであるマイナンバーの 12 桁目を抽出します。
  • チェックディジットの値と、(以降の説明) で得られた結果を比較し、

   - 同じ値であれば「true」を返します。
   - 異なる値であれば「false」を返します。

f:id:kintani:20151217101455p:plain

3. Σ (Pn × Qn) を算出します。

 ・「途中文字列」ロジックを使用し、Pn の値を抽出します。
 ・「数値定数」ロジックを使用し、Qn の値を入力します。
 ・「掛け算」ロジックを使用し、Pn × Qn を計算します。
 ・「足し算」ロジックを使用し、Pn × Qn の総和を計算します。

f:id:kintani:20151217101520p:plain

4. 3 の結果を 11 で割った余りが 1 以下であれば「0」 、それ以外であればその値から 11 を引きます。

  • 「余り」ロジックを使用し、3 の結果から 11 で割った余りを取得します。
  • 余りが 1 以下であれば、「0」を返すようにします。
  • それ以外であれば、「引き算」ロジックを使用し、11 からその値を引きます。最後に引いた値を返すようにします。

f:id:kintani:20151217101539p:plain

5. 4 の結果をチェックディジットの値と比較するようフローを繋げます。

ここまでで、マイナンバーのチェックを行うユーザ定義ロジックが完成しました。
次に、スクリプトキャンバスにオペレーションを配置して、スクリプトを完成させていきたいと思います。

6. Excel アダプタの「シートから読み取り処理」オペレーションのアイコンと「書き込み」オペレーションのアイコンを適宜配置し、それぞれ設定します。

f:id:kintani:20151217101708p:plain

7. 読み取り後の Mapper ではじめに作成したユーザ定義ロジックを配置し、出力結果が true であれば「Correct」、false であれば「Not Correct」をシートに書き込むように設定します。

f:id:kintani:20151217101718p:plain

これでようやくスクリプトが完成しました。
実際にスクリプトを実行し、以下のようなシートに書き込まれているマイナンバーの正否判定をしてみます。

f:id:kintani:20151217101807p:plain

結果がでました!
今回の例ですと、「123456789018」のみが正しいマイナンバーであるということがわかりました。

※ ゾロ目番号「000000000000」は実際には存在しないようですが、算式の結果では正しいマイナンバーという結果になってしまいますので、最初に除外したり値の取扱いを決めたほうがよいかもしれないですね。

 

さいごに

感想

  • 文系で計算嫌いな人間ですので、始めは難しそうでかなり動揺しましたが、実際にやってみれば思ったより簡単な印象を受けました。
  • ブログ初投稿であまりこういった文章も書くことがなかったため、書くと決めてはみたものの正直きつかったです。でも書くにつれ徐々に楽しく感じてきた、かな。

反省点

  • 今さらですが Enterprise 製品である「DataSpider Servista」であれば、マイナンバーより法人番号のチェックを説明したほうが良かったのかなぁと思いました。
  • 実装は算出式に沿って順に定義していきましたが、もっと簡単にできるんでしょうね。汗
  • 文章がこなれてない。笑

という感じで今回は以上となります。

それでは皆様、良いマイナンバーライフを!!