GoEasy-OTP

什么是GoEasy-OTP?有什么用途呢?

GoEasy-OTP(One-time password)是GoEasy对app key的安全保护措施,安全可靠,简单易用! 将会有效杜绝他人通过在页面上获取app key的方式,进行非法操作。

GoEasy-OTP是如何工作的呢?

    var goEasy = new GoEasy({
        appkey: '您的client key',
        otp:'您服务器端生成的OTP'
    });
  1. 当您在Javascript代码中初始化一个goEasy对象的时候,除了需要app key做为参数,还需要传入一个新参数:otp。
  2. GoEasy-OTP是一个在您的服务器端按照GoEasy OTP的算法规则来生成的加密字符串,每个页面都需要一个独一无二的GoEasy-OTP。
  3. GoEasy将会对OTP进行合法性验证,因为每个OTP只可以使用一次,即使他人从页面代码中获得了app key,也无法推送或接收消息。

我想使用GoEasy-OTP来保护我的消息,要如何开始呢?

登录GoEasy,找到“Professional keys”,您会发现3个key:

  1. Client key: 仅用于客户端,必须和OTP一起使用,既可以推送,也可以订阅,服务器端无法使用。
  2. Restful key: 仅用于调用Restful api,无法用于客户端订阅和推送。
  3. Secret key: 用于在生成GoEasy-OTP时,作为加密的秘钥。

    在server端生成GoEasyOTP,规则:

  4. 声明一个字符串,内容为"000"+当前系统毫秒数
  5. 将Secret key作为秘钥,用AES(ECB)算法对字符串进行加密
  6. 使用Base64对加密结果进行编码,结果就是GoEasyOTP
  7. 验证自己的OTP算法是否工作:

测试参数:

secret key:86726e4356dce2d3

系统毫秒数:0001490325990593

测试结果:+rOKqbTZioistsdMrhon0A==

修改Javascript代码,使用Client key作为appkey,同时传入服务器端生成的OTP

    var goEasy = new GoEasy({
        appkey: '您的client key',
        otp:'您服务器端生成的OTP'
    });

结束

生成GoEasy-OTP参考代码

Java

    public static String goEasyOTP(String secretKey) {
        try {
            String otp = "000" + System.currentTimeMillis();
            SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
            byte[] otpBytes = otp.getBytes();
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] encryptedOTP = cipher.doFinal(otpBytes);
            otp = new BASE64Encoder().encode(encryptedOTP);
            return otp;
        } catch (Exception e) {
            throw new IllegalStateException("Failed to generate GoEasy-OTP.", e);
        }
    }

Python

from Crypto.Cipher import AES

def goEasyOTP(secretKey):
    otp = "000" + str(int(round(time.time() * 1000)))
    cipher = AES.new(secretKey, AES.MODE_ECB)
    encryptedOtp = cipher.encrypt(otp)
    encryptedOtp = base64.b64encode(encryptedOtp)
    return encryptedOtp

PHP

    public function goEasyOTP($secretKey){
        $key = $secretKey;
        //$key=86726e4356dce2d3;
        list($t1, $t2) = explode(' ', microtime());
        $text=(float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000);
        $text = "000".$text;
        //$text = "0001490325990593";
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $crypttext =base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_ECB, $iv));
        return $crypttext;
    }

C#

    public string goEasyOTP(string secretKey)
    {
        string otp = null;
        byte[] encrypted = null;
        string currentTimeMills=string.Format("000{0}",(long)(DateTime.UtcNow-new
        DateTime(1970,1,1,0,0,0,DateTimeKind.Utc)).TotalMilliseconds);
        //"0001490325990593"
        byte[] byteSecretKey = Encoding.ASCII.GetBytes(secretKey);
        using (AesManaged aesAlg = new AesManaged(){Key = byteSecretKey,Mode = CipherMode.ECB,Padding = PaddingMode.None})
        {
        ICryptoTransform encryptor = aesAlg.CreateEncryptor();
        using (MemoryStream msEncrypt = new MemoryStream())
            {
            using(CryptoStream csEncrypt = new CryptoStream(msEncrypt,encryptor,CryptoStreamMode.Write))
                {
                    using(StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(currentTimeMills);
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }
        }
        otp = Convert.ToBase64String(encrypted);
        return otp;
    }

Ruby

Coming...

results matching ""

    No results matching ""