好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

详解淘宝H5 sign加密算法

淘宝 对于h5的访问采用了和客户端不同的方式,由于在h5的js代码中保存appsercret具有较高的 风险 ,mtop采用了随机分配令牌的方式,为每个访问端分配一个token,保存在用户的cookie中,通过cookie带回服务端分配的token, 客户端 利用 分配的token对请求的URL参数生成摘要值sign,MTOP利用这个摘用值和cookie中的token来 防 止URL篡改。

流程

当本地cookie中的token为空时(通常是第一次访问),mtop会收到]F ai L_ Sys _TOKEN_EXOI red :: 令牌过期[这个错误应答,同时mtop会生成token写入cookie中(response.cookies);
第二次请求时,js通过读取cookie中的token值,按照约定的算法生成sign, sign在mtop的请求中带上,mtop通过cookie中和token用同样的方式计算出sign,与请求的sign进行比较,检查通过将返回api的应答,失败提示[FAIL_SYS_ILLEGAL_ACCESS:: 非法请求];

cookie中的token是有时效性的,遇到token失效时,将收到应答"FAIL_SYS_TOKEN_EXOIRED:: 令牌过期", 同时会写入新的token,js利用新的token重新计算sign并重发请求;
关于cookie中的token的自我检查,由于token在cookie中是明文的,可能会被仿冒,在输出的cookie中包含一个用非对称密钥的公钥加密后的token, MTOP在每次请求时会先检查cookie中的token 是否 是由服务端分配出去的(利用加密后的token和私钥还原token,与回传的明文token比较)

sign 生成

关于sign的生成公式:

md5Hex(token& am  p; t&appKey&data)

如:md5Hex("30dc68e5b4 CF 40ebd02fb05673c7e3b7&1572522062317&12345678&{" IT emNumId":"1502111132496"}")

sign=4c1e7b6853fa7a5e1b8f7066ee22932f

实现代码:

p ub lic  stat ic String calcSignature(String token, String timestamp, String appKey, String data) {
        return DigestUtils.md5Hex(StringUtils.trimToEmpty(token) + "&"
                + timestamp + "&" + appKey + "&" + data);
    }

    public static void main(String[]  arg s) {
        String token="30dc68e5b4cf40ebd02fb05673c7e3b7";
        String timestamp="1572522062317";
        String sign = calcSignature(token, timestamp, "12345678", "{\"itemNumId\":\"1502111132496\"}");
        System.out. PR intln(sign);
    }

token

m_h5tk: 格式为 明文token_e xp ireTime, 从response.cookies处获取,如: 30dc68e5b4cf40ebd02fb05673c7e3b7_1572522062317

token就是 30dc68e5b4cf40ebd02fb05673c7e3b7
失效时间是 1572522062317

可封装在一个类中负责存储token

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Credentials implements Comparable<Credentials> {
    private String _m_h5_tk;
    private String _m_h5_tk_enc;

    private static final int OFFSET = 60000;

    public String getToken() {
        return StringUtils.i SEM pty(_m_h5_tk) ? null : _m_h5_tk.substring(0, _m_h5_tk.indexOf("_"));
    }

    public long getExpireTimestamp() {
        long t = new Date().getTime() - OFFSET;
        if (StringUtils.isEmpty(_m_h5_tk) || StringUtils.isEmpty(_m_h5_tk_enc)) {
            return t;
        }
        try {
            return Long.parseLong(_m_h5_tk.substring(_m_h5_tk.indexOf("_") + 1));
        } catch (NumberFor MATE xception e) {
            return t;
        }
    }

    public boolean isExpired() {
        if (StringUtils.isEmpty(_m_h5_tk) || StringUtils.isEmpty(_m_h5_tk_enc)) {
            return true;
        }
        return new Date().getTime() > getExpireTimestamp();
    }

    @ override 
    public int compareTo(Credentials o) {
        return Long .COM pare(o.getExpireTimestamp(), this.getExpireTimestamp());
    }
}

t
很 简单 ,即时间戳 通过 new Date().getTime() 获得

appKey
固定数值 通过抓包工具在请求参数中可获得,参数名 appKey

data
提交的参数 通过抓包工具在请求参数中可获得 通常是一个JSON字符串

到此这篇关于详解淘宝H5 sign加密算法的 文章 就介绍到这了,更多相关淘宝H5 sign加密内容请搜索以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!

总结

以上是 为你收集整理的 详解淘宝H5 sign加密算法 全部内容,希望文章能够帮你解决 详解淘宝H5 sign加密算法 所遇到的问题。

如果觉得 网站内容还不错, 推荐好友。

查看更多关于详解淘宝H5 sign加密算法的详细内容...

  阅读:29次