zoukankan      html  css  js  c++  java
  • 一次接口签名引发的笑话

    接口签名规则如下:

    1. 1.timestamp+method(请求方式大写)+path用base64编码,sha256加密
    2. 2.每次请求之前须签名下,
    3. 3.api-expiry设置过期时间

    Sample 签名方式:

    Java 

    import org.apache.commons.codec.binary.Hex;
    import javax.crypto.Mac;
    import javax.crypto.spec.SecretKeySpec;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.util.Base64;
    
    public class ApiSignGenerator {
    
        public static String generateApiSign(long timestamp, String method, String path, String apiSecret) throws NoSuchAlgorithmException, InvalidKeyException {
            String algorithm = "HmacSHA256";
            String message = timestamp + (method == null ? "" : method.toUpperCase()) + (path == null ? "" : path);
            byte[] encodedSecret = Base64.getEncoder().encode(apiSecret.getBytes());
            SecretKeySpec secretKeySpec = new SecretKeySpec(encodedSecret, algorithm);
            Mac mac = Mac.getInstance(algorithm);
            mac.init(secretKeySpec);
            byte[] bytes = mac.doFinal(message.getBytes());
            return new String(Hex.encodeHex(bytes));
         }
    
        // If you want sent request to "https://api.xxxx.com/api/accounts", you can generate sign by doing this:
        public static void getAccounts() throws InvalidKeyException, NoSuchAlgorithmException {
            long timestamp = 1553596255786L; // System.currentTimeMillis();
            String method = "GET";
            String path = "/api/accounts";
            String apiSecret = "NCtRU0JwZWZnVFVDZmlMRFduMk1hTFZDM05vS3g1Z3E1c1h6blB0RmxXRT0=";
            String apiSign = generateApiSign(timestamp, method, path, apiSecret);
            System.out.println("apiSign:" + apiSign);
            // The console will print:"apiSign:e4c8f42e18b551dcebd5801bfa254498e98d20e0a5322b30c78a7004aa5a2669"
        }
    
    }


    javascript:
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.js"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Base64/1.0.1/base64.js"></script>
    <script type="text/javascript">
        function generateApiSign(timestamp, method, path, apiSecret) {
            var message = timestamp + method + path;
            var encodedSecret = window.btoa(apiSecret);
            return CryptoJS.HmacSHA256(message, encodedSecret).toString();
        };
    
    
        // If you want sent request to "https://api.xxxx.com/api/accounts", you can generate sign by doing this:
        function getAccounts() {
            var timestamp = 1553596255786;//new Data().getMilliseconds();
            var method = "GET";
            var path = "/api/accounts";
            var apiSecret = "NCtRU0JwZWZnVFVDZmlMRFduMk1hTFZDM05vS3g1Z3E1c1h6blB0RmxXRT0=";
            var apiSign = generateApiSign(timestamp, method, path, apiSecret);
            console.info("apiSign:" + apiSign);
            // The console will print:"apiSign:e4c8f42e18b551dcebd5801bfa254498e98d20e0a5322b30c78a7004aa5a2669"
        };
    
    </script>
    

     

    python:

    def sign_request(method,path,apiSecret):
        r_time = str(time.time()*1000)[0:13]
        method = method.upper()
    
        enbase64key = base64.b64encode(apiSecret.encode("utf-8")).decode("utf-8") //关键一步,将str用base64编码
        message = r_time+method+path
        # print(enbase64key,message)
        api_sign = hmac.new(bytes(enbase64key, encoding='utf-8'), bytes(message, encoding='utf-8'),
                             digestmod=hashlib.sha256).digest()
        HEX = api_sign.hex()
    
        return (HEX,r_time)
    
    def balances():
        api_sign = sign_request("get", "/api/balances", "/UM0EDr+QhnAMR9yhsynXW1bAa1MxpOt8U+yvPJuHUk=")
        header = {
            "API-KEY": "77f485d5039455b9e7b48657dec357df",
            "API-SIGN": api_sign[0],
            "API-TIMESTAMP": api_sign[1],
            "API-PASSCODE": "qwerdf886."
        }
        res = requests.get("http://116.6.110.50:8007/api/balances", headers=header)
        print(res.text)
    
        return ""
    def batch_place_order(price,increasing,account):
        #批量下订单,price 初始价格 increasing 每次递增价格 account 下多少单
        index = 0
        while(index<account):
            # time.sleep(2)
            index+= 1
            price = float(price)
            price+=increasing
            print(index,price,type(price))
            api_sign = sign_request("post", "/api/orders", "/UM0EDr+QhnAMR9yhsynXW1bAa1MxpOt8U+yvPJuHUk=")
            header = {
                "API-KEY": "77f485d5039455b9e7b48657dec357df",
                "API-SIGN": api_sign[0],
                "API-TIMESTAMP": api_sign[1],
                "API-PASSCODE": "qwerdf886."
            }
    
            date = {
                "instrumentId": "BXBT-ETH",
                "orderType": "LIMIT",
                "postOnly": False,
                "price": str(price)[0:8],
                "selfTradePrevention": "CN",
                "side": "BUY",
                "size": "1134",
                "timeInForce": "GTC"
            }
            res = requests.post("http://116.6.110.50:8007/api/orders",headers = header,data=json.dumps(date))
            print(res.text)
        return  ""
    

      

      postman请求方式:

      预执行脚本签名,通过大括号取值

  • 相关阅读:
    自定义组件要加@click方法
    绑定样式
    647. Palindromic Substrings
    215. Kth Largest Element in an Array
    448. Find All Numbers Disappeared in an Array
    287. Find the Duplicate Number
    283. Move Zeroes
    234. Palindrome Linked List
    202. Happy Number
    217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/Cola886/p/11805385.html
Copyright © 2011-2022 走看看