1. 程式人生 > >黃聰:OTP動態密碼_Java代碼實現

黃聰:OTP動態密碼_Java代碼實現

-c name 好的 動態口令 comm final 並不是 bsp down

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();
    }

測試:
技術分享圖片

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/qq_26641781/article/details/77573008

黃聰:OTP動態密碼_Java代碼實現