標籤:通道 種子 tor 挑戰 相關 sm3 https nal bsp
OTP認知
動態口令(OTP,One-Time Password)又稱單次密碼,是使用密碼技術實現的在用戶端和伺服器之間通過共用秘密的一種認證技術,是一種強認證技術,是增強目前靜態口令認證的一種非常方便技術手段,是一種重要的雙因素認證技術,動態口令認證技術包括用戶端用於產生口令產生器的,動態令牌,是一個硬體裝置,和用於管理令牌及口令認證的後台動態口令認證系統組成。
一、OTP曆史溯源
動態口令(OTP)有一個同名確不同翻譯的前輩,單次密碼(OTP, One-Time Pad),也叫密電本,是一種應用于軍事領域的諜報技術,即對通訊資訊使用預先約定的一次性密電本進行加密和解密,使用後的密電本部分丟棄不再使用,能夠做到一次一密。如果看過一些國內的諜戰電視劇可能會對在二戰時期,日本轟炸重慶中的一個號稱“獨臂大盜”的日本間諜有印象的話,他同日軍通電使用的就是單次密碼技術,使用諾貝爾獲獎的小說《The Good Earth》進行諜報編碼,最後是被稱為美國密碼之父的赫伯特·亞德利破獲。而目前在安全強認證領域使用的OTP動態密碼技術,源於最早由RSA公司於1986年開發的RSA SecureID產品,動態密碼並不是單次密碼技術,而是動態一次性口令技術。目前,國際上動態口令OTP有2大主流演算法,一個是RSA SecurID ,一個是OATH組織的OTP演算法。如果在國內來說的話,另一個是國密的OTP密碼演算法。RSA SecurID使用AES對稱演算法,OATH使用HMAC演算法,國密演算法使用的國密SM1(對稱)和SM3(HASH)演算法。
二、OTP認證原理與同步方法
動態口令的基本認證原理是在認證雙方共用密鑰,也稱種子密鑰,並使用的同一個種子金鑰組某一個事件計數、或時間值、或者是非同步挑戰數進行密碼演算法計算,使用的演算法有對稱演算法、HASH、HMAC,之後比較計算值是否一致進行認證。可以做到一次一個動態口令,使用後作廢,口令長度通常為6-8個數字,使用方便,與通常的靜態口令認證方式類似,使用方便與系統整合好,因此OTP動態口令技術的應用非常普遍,可以應用於多種系統渠道使用,如:Web應用、手機應用、電話應用、ATM自助終端等。
動態口令的同步機制有3種,即時間型、事件型和挑戰與應答型,目前應用最多的是時間型動態口令,挑戰與應答型動態口令的應用也逐漸增多,並且動態口令逐漸層為多種同步類型複合的機制發展,如時間+挑戰與應答型。
目前在資訊系統中使用的增強型認證技術包括: 1 USBKey: 申請PKI認證。 2 動態口令卡:列印好的密碼刮刮卡。 3 動態簡訊:使用電信通道下發口令。 4 IC卡/SIM卡:內建與使用者身份相關的資訊。 5 生物識別特徵:採用獨一無二的生物識別特徵來驗證身份,如指紋。 6 動態令牌:動態口令產生器和認證系統。
現在直接上代碼實現OTP動態密碼:
private static final int[] DIGITS_POWER = {1,10,100,1000,10000,100000,1000000,10000000,100000000}; public static byte[] hmac_sha1(byte[] keyBytes, byte[] text)throws NoSuchAlgorithmException, InvalidKeyException{ try {//? Mac hmacSha1; try { hmacSha1 = Mac.getInstance("HmacSHA1"); } catch (NoSuchAlgorithmException nsae) { hmacSha1 = Mac.getInstance("HMAC-SHA-1"); } SecretKeySpec macKey =new SecretKeySpec(keyBytes, "RAW"); hmacSha1.init(macKey); return hmacSha1.doFinal(text); } catch (GeneralSecurityException gse) { throw new UndeclaredThrowableException(gse); } } public static String generateOTP(byte[] secret,long movingFactor,int codeDigits)throws NoSuchAlgorithmException, InvalidKeyException { StringBuffer result = new StringBuffer(""); byte[] text = new byte[6]; for (int i =text.length-1; i >=0; i--) { text[i] = (byte) (movingFactor & 0xff ); // movingFactor >>= 6; } byte[] hash = hmac_sha1(secret, text); //Step 1: Generate an HMAC-SHA-1 value int offset =( hash[hash.length - 1] & 0xf)+3; // int binary = ((hash[offset] & 0x7f) << 24) | ((hash[offset - 1] & 0xff) << 16) | ((hash[offset - 2] & 0xff) << 8) | (hash[offset - 3] & 0xff); //Generate a 4-byte string int otp = binary % DIGITS_POWER[codeDigits-1]; result .append(Integer.toString(otp)); while (result.length() < codeDigits) { result.insert(0, "0"); //Compute an HOTP value } return result.toString(); }
測試:
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。77573008
黃聰:OTP動態密碼_Java代碼實現