開発に特化したハッピー・ディズニー・システム開発会社

  ハッピーディズニーのシステム開発「フォン・健康」[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> =(バイト)値。

おすすめ

転載: www.cnblogs.com/dfdsf123/p/11766568.html