サンプルコード: ワンタイムパスワード (OTP) のデモ

スマートフォンタブレット

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Sample Code: One Time Password (OTP) Demo」(http://software.intel.com/en-us/android/articles/sample-code-one-time-password-otp-demo) の日本語参考訳です。


サンプルコードのダウンロード: https://software.intel.com/en-us/file/otpdemozip

アプリケーション提供元:
インテル コーポレーション SSG

はじめに

従来、2 要素認証では、ユーザーが知っている情報 (ユーザー名とパスワード) とユーザーが保有している何らかの情報 (短時間だけ有効で、オンデマンドにて利用可能なトークンや 6 桁の乱数を生成するキーホルダー型の物) を組み合わせたワンタイムパスワード (OTP) が採用されます。

しかし、2 要素認証をすでに使用しているユーザーの多くが、トークンの使い勝手や持ち運びに関してさまざまな不満を感じています。また、紛失したり破損したトークンの交換や、ユーザーによる OTP の入力ミスは、ヘルプデスクと IT 部門を悩ませる原因にもなっています このような課題に応えるのが、OTP 機能を備えたインテル® アイデンティティー・プロテクション・テクノロジー (インテル® IPT) です。インテル® IPT は、ビルトインのハードウェア・トークンを提供することで、物理的なトークンを個別に用意する必要がありません。このため、2 要素認証に基づく VPN ログイン処理が簡素化され、遅延がほとんどないシームレスなユーザー体験を実現します。インテル® IPT に基づく 2 要素認証ソリューションは、OEM およびセキュリティー関連の ISV から提供されています。

この記事では、OTP 機能の高レベルの概要を説明し、Android* で OTP API を使用する方法を紹介します。

コードと説明

このデモには、OTP のプロビジョニング、OTP の生成、OTP の検証の 3 つの重要な機能が含まれています。また、システムの OTP 機能と OTP バージョンを照会する API も含まれています。

OTP のプロビジョニング

InvokeIPTProv は AsyncTask を拡張し、バックグラウンドでプロビジョニングを実行します。最初にセキュリティー・サービス (プロビジョン・サービス) を作成した後、プロビジョニング・プロセスを開始します。

@Override
protected Void doInBackground(Void... params) {
    ChaabiProvision prov = new ChaabiProvision();
    try {
        prov.execute().get(PROV_MAX_TIMEOUT, TimeUnit.MILLISECONDS);
    } catch (InterruptedException e) {
        error = "Provisioning failed: " + e.getClass().getName() + ": "
            + e.getLocalizedMessage();
        e.printStackTrace();
    } catch (ExecutionException e) {
        error = "Provisioning failed: " + e.getClass().getName() + ": "
            + e.getLocalizedMessage();
        e.printStackTrace();
    } catch (TimeoutException e) {
        error = "Provisioning failed: " + e.getClass().getName() + ": "
            + e.getLocalizedMessage();
        e.printStackTrace();
    }
    return null;
}

OTP の生成

OTP の生成を開始する前に、デバイスがプロビジョニング・プロセスを正常に完了したかどうかを確認する必要があります。

// トークンが存在するかどうかを確認
if (!readData()) {
    tvOTPGenerate.setText(
        "OTP generation failed: No token exists. Please do provisioning.");
    return;
}

次に、Async 呼び出しを行い、OTP を生成します。

boolean invokeResyncGenerateOTP(IPTWrapper obj) {
    try {
        // サーバーに再同期メッセージをリクエストして 
        // 受け取った再同期メッセージを処理
        InvokeIPTResync ipt_obj = new InvokeIPTResync();
        boolean status = ipt_obj.execute().get();
        if (status) {

            // サーバー再同期メッセージを処理
            obj.ProcessResyncMessage(encrToken_b64, serverResyncMessage);

            // OTP の生成を再度呼び出す 
            // トークンが OCRA タイプかどうかを確認
            if (tokenInfo.equalsIgnoreCase(
                    OTPDemoActivity.OCRA_TOKEN_INFO)) {
                invokeGenerateOTP(obj, true);
            } else {
                invokeGenerateOTP(obj, false);
            }
            displayOTP();
            progressDialog.dismiss();
        } else {
            String error = "Receive server resync message failed.";
            tvOTPGenerate.setText(error);
            progressDialog.dismiss();
            OTPDemoActivity.OTP = null;
            return false;
        }
    } catch (IhaException e) {
        String error = "OTP generation failed. Message: "
            + e.getLocalizedMessage() + " Error code: " + e.GetError();
        tvOTPGenerate.setText(error);
        progressDialog.dismiss();
        OTPDemoActivity.OTP = null;
        return false;
    } catch (Exception e) {
        String error = "OTP generation failed: " + e.getClass().getName()
            + ": " + e.getLocalizedMessage();
        tvOTPGenerate.setText(error);
        progressDialog.dismiss();
        OTPDemoActivity.OTP = null;
        return false;
    }
    return true;
}

OTP の検証

OTP が生成されたら、OTP の有効性を検証します。

    ChaabiOTPVerify otp_ver = new ChaabiOTPVerify();
    try {
        otp_ver.execute()
            .get(OTP_VERIFY_TIMEOUT, TimeUnit.MILLISECONDS);
    } catch (InterruptedException e) {
        error = "OTP verification failed: " + e.getClass().getName()
            + ": " + e.getLocalizedMessage();
        e.printStackTrace();
    } catch (ExecutionException e) {
        error = "OTP verification failed: " + e.getClass().getName()
            + ": " + e.getLocalizedMessage();
        e.printStackTrace();
    } catch (TimeoutException e) {
        error = "OTP verification failed: " + e.getClass().getName()
            + ": " + e.getLocalizedMessage();
        e.printStackTrace();
    }
    return null;

...

    } catch (JSONException e) {
        error = e.getClass().getName() + ": " + e.getLocalizedMessage();
        status = false;
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        error = e.getClass().getName() + ": " + e.getLocalizedMessage();
        status = false;
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        error = e.getClass().getName() + ": " + e.getLocalizedMessage();
        status = false;
        e.printStackTrace();
    } catch (IOException e) {
        error = e.getClass().getName() + ": " + e.getLocalizedMessage();
        status = false;
        e.printStackTrace();
    }
    Log.v(LOG_TAG, "Return results: " + status);
    return status;
}

OTP 機能の照会

ビルトインのハードウェア・ベースの OTP はすべてのモバイルデバイスで利用できるわけではないため、OTP 機能が利用可能かどうか、最初にシステムに照会します。

private boolean isOTPCapable(){
    try {
        IPTWrapper caps = new IPTWrapper();
        String cap = caps.GetCapabilities();
        displayMessage("Capabilities: " + cap);
        return true; 
    } catch (IhaException e) {
        String error = "GetCapabilities() failed. Message: "
            + e.getLocalizedMessage() + " Error code: "
            + e.GetError();
        notifyUser("Failed: " + error);
        return false;
    } catch (Exception e) {
        String error = "GetCapabilities() failed: "
            + e.getClass().getName() + ": "
            + e.getLocalizedMessage();
        notifyUser("Failed: " + error);
        return false;
    }
}

まとめ

この記事で説明したサンプルのようなコードを実装することにより、OPT 対応インテル® IPT と OTP API を用いてインテル® プロセッサー搭載の Android* プラットフォーム上でハードウェア・ベースの OTP を利用する方法を素早く理解できます。

著者紹介

Peng Wang
インテル コーポレーションのソフトウェア & ソリューション・グループ (SSG) デベロッパー・リレーション部門 インテル® Atom™ プロセッサー・ハイ・タッチ・ソフトウェア・イネーブリング・チームのメンバー。SSG に入る前は、ウルトラ・モバイル・グループの統合および検証チームを指揮していました。 

著作権と商標について

本資料に掲載されている情報は、インテル製品の概要説明を目的としたものです。本資料は、明示されているか否かにかかわらず、また禁反言によるとよらずにかかわらず、いかなる知的財産権のライセンスを許諾するものではありません。製品に付属の売買契約書『Intel’s Terms and Conditions of Sale』に規定されている場合を除き、インテルはいかなる責任を負うものではなく、またインテル製品の販売や使用に関する明示または黙示の保証 (特定目的への適合性、商品適格性、あらゆる特許権、著作権、その他知的財産権の非侵害性への保証を含む) に関してもいかなる責任も負いません。

インテルによる書面での合意がない限り、インテル製品は、その欠陥や故障によって人身事故が発生するようなアプリケーションでの使用を想定した設計は行われていません。

インテル製品は、予告なく仕様や説明が変更される場合があります。機能または命令の一覧で「留保」または「未定義」と記されているものがありますが、その「機能が存在しない」あるいは「性質が留保付である」という状態を設計の前提にしないでください。これらの項目は、インテルが将来のために留保しているものです。インテルが将来これらの項目を定義したことにより、衝突が生じたり互換性が失われたりしても、インテルは一切責任を負いません。この情報は予告なく変更されることがあります。この情報だけに基づいて設計を最終的なものとしないでください。

本資料で説明されている製品には、エラッタと呼ばれる設計上の不具合が含まれている可能性があり、公表されている仕様とは異なる動作をする場合があります。現在確認済みのエラッタについては、インテルまでお問い合わせください。

最新の仕様をご希望の場合や製品をご注文の場合は、お近くのインテルの営業所または販売代理店にお問い合わせください。

本資料で紹介されている資料番号付きのドキュメントや、インテルのその他の資料を入手するには、1-800-548-4725 (アメリカ合衆国) までご連絡いただくか、http://www.intel.com/design/literature.htm (英語) を参照してください。

性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル® マイクロプロセッサー用に最適化されていることがあります。SYSmark* や MobileMark* などの性能テストは、特定のコンピューター・システム、コンポーネント、ソフトウェア、操作、機能に基づいて行ったものです。結果はこれらの要因によって異なります。製品の購入を検討される場合は、他の製品と組み合わせた場合の本製品の性能など、ほかの情報や性能テストも参考にして、パフォーマンスを総合的に評価することをお勧めします。

本資料に含まれるソフトウェア・ソース・コードはソフトウェア・ライセンス契約に基づいて提供されるものであり、その使用および複製はライセンス契約で定められた条件下でのみ許可されます。

Intel、インテル、Intel ロゴ、Intel Atom は、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。

© 2014 Intel Corporation. 無断での引用、転載を禁じます。

* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

タイトルとURLをコピーしました