ハッピーディズニーのシステム開発「フォン・健康」[191﹎5743﹍0738] [V]や電気喜びディズニーモデルの開発、アプリケーション開発ディズニーの喜び、ディズニープラットフォーム開発の喜び、ディズニーのソフトウェア開発の喜び。ハッピーディズニーソース開発システム。ディズニーモデル系のカスタム開発、ディズニーモードアプリシステムのカスタム開発の喜びに似た喜びディズニーモードのソフトウェアのカスタム開発、ハッピー、モデル開発の場合と同様に、ディズニー、開発に特化したディズニーの喜びのシステム開発会社、アプリ開発の専門知識の喜びディズニー・開発会社の喜びを説明
------ヒント:プロの開発会社、非パーティプラットフォーム、プレイヤーは困りません------
オンライン多くのバックエンドコード、ちょうど利用できるテストを見つけます
パッケージcom.bessky.hrmis.common.rbac.encrypt。
輸入java.security.InvalidKeyException。
輸入java.security.NoSuchAlgorithmException。
インポートにjava.security.SecureRandom;
輸入javax.crypto.Mac;
インポートするjavax.crypto.spec.SecretKeySpec;
輸入org.apache.commons.codec.binary.Base32。
輸入org.apache.commons.codec.binary.Base64。
/ **
*
*
* Googleの認証、Javaサーバが達成するために
* /
パブリッククラスGoogleAuthenticator {
//生成されたキーの長さ(秘密鍵の長さの生成)
= 10のpublic static final int型SECRET_SIZE。
public static final String型SEED = "g8GjEvTbW5oVSV7avL47357438reyhreyuryetredLDVKs2m0QN7vxRs2im5MDaNCWGmcD2rvcZx"。
// Javaの達成するための乱数アルゴリズム
public static final文字列RANDOM_NUMBER_ALGORITHM = "SHA1PRNG"。
//最大時間オフセット
int型WINDOW_SIZE = 10; //デフォルトの3-maxの17
/ **
*窓size.Thisセットの数を表す整数値であります
* 30秒の窓は、我々は、より寛容ウィンドウ大きなを許可します
*クロック・スキュー、私たちはあります。
*
停止* S
*ウィンドウサイズなければならないことが> = 1と< = 17.Other値は無視され
* /
公共ボイドsetWindowSize(int型の){
IF(S> = 1つの&& S< = 17)
WINDOW_SIZE = S;
}
/ **
*生成ランダムな秘密key.Thisは、サーバによって保存されなければならないと
*ユーザーに関連付けられているGoogleが表示されるコードを確認するためにアカウント
* Authenticator.Theユーザーが自分のデバイス上でこの秘密を登録する必要があります。
*ランダムな秘密鍵を生成します
*
*リターン秘密鍵
* /
公共の静的な文字列generateSecretKey(){
SecureRandom SR = NULL;
{試します
SR = SecureRandom.getInstance(RANDOM_NUMBER_ALGORITHM)。
sr.setSeed(Base64.decodeBase64(SEED.getBytes()))。
バイト[]バッファ= sr.generateSeed(SECRET_SIZE)。
Base32コーデック=新しいBase32();
バイト[] bEncodedKey = codec.encode(バッファ)
文字列のencodedKey =新しい文字列(bEncodedKey)。
encodedKeyを返します。
}キャッチ(持つNoSuchAlgorithmException電子){
// ...構成エラーが発生することはありません
}
ヌルを返します。
}
/ **
* Google認証識別文字列を生成し、この方法は、値を返すだけで、二次元コードをスキャンすることができる生成する必要があります。
*のparamラベル
*ラベル
*のparamユーザー
*アカウント
*のparam秘密
*キー
*リターン
* /
公共の静的な文字列getQRBarcode(文字列のラベル、文字列のユーザー、文字列の秘密){
文字列フォーマット= "?otpauth:// TOTP /%sの:%sの秘密=%sの";
String.Formatの(フォーマット、ラベル、ユーザー、秘密)を返します。
}
/ **
* Google認証識別文字列を生成し、この方法は、値を返すだけで、二次元コードをスキャンすることができる生成する必要があります。
*
*のparamユーザー
*アカウント
*のparam秘密
*キー
*リターン
* /
公共の静的な文字列getQRBarcode(文字列のユーザは、文字列秘密){
文字列フォーマット= "?otpauth:// TOTP /%sの秘密=%sの";
String.Formatの(フォーマット、ユーザー、秘密)を返します。
}
/ **
*それが有効な验证コード是否であるかどうかを確認するために、ユーザーが入力したコードをチェック合法
*
*のparam秘密
*秘密のユーザー。
*のparamコード
*ユーザーデバイス上に表示されるコード
*のparamトン
*ミリ秒(例えばのSystem.currentTimeMillis())の時間
*リターン
* /
パブリックブールcheck_code(文字列秘密、ロングコード、長いtimeMsec){
( "||秘密==ヌル"。)秘密(等しい)場合
{
falseを返します。
}
Base32コーデック=新しいBase32();
バイト[] decodedKey = codec.decode(秘密)。
// UNIXミリ秒の時間は30秒、「窓」に変換します
//これはTOTP仕様ごとである(詳細については、RFCを参照してください)
長いT =(timeMsec / 1000L)/ 30L。
//ウィンドウが近い過去に発生したコードをチェックするために使用されます。
//あなたが行くことを喜んでどこまでチューニングするために、この値を使用することができます。
用(INT I = -window_size; I |≦WINDOW_SIZE; ++ I){
長いハッシュ;
{試します
ハッシュ= verify_code(decodedKey、T + I)。
}キャッチ(例外e){
//はい、これは悪いフォームが、
//スローされた例外はまれと静的になります
//設定の問題
e.printStackTrace();
新しいのRuntimeExceptionをスロー(e.getMessage());
//はfalseを返します。
}
IF(ハッシュ==コード){
trueを返します。
}
}
//検証コードは無効です。
falseを返します。
}
プライベート静的int型verify_code(バイト[]キー、長いt)を持つNoSuchAlgorithmException、例外:InvalidKeyExceptionを{スロー
バイト[]データ=新しいバイト[8]。
長い値= T。
以下のために(INT I = 8、I - > 0;値>>> = 8){
データ<I> =(バイト)値。