1. ホーム
  2. Web制作
  3. html5

タオバオH5サイン暗号化アルゴリズムの詳細

2022-01-26 22:46:48

淘宝網はh5アクセスとクライアント側に異なるアプローチを採用し、h5のjsコードにappsercretを保存するリスクが高いため、mtopはランダムに割り当てられたトークンを使用し、ユーザーのクッキーに保存され、クッキーを通じてサーバーによって割り当てられたトークンを持ち帰る、クライアントは割り当てられたトークンを使用して、要求したURLパラメータに対してダイジェスト値の符号を生成し、MTOPは、URLの改ざんと防ぐためにこのダイジェスト値およびクッキー内のトークンを使用してください。

処理方法

ローカル・クッキーのトークンが空になると(通常は初回訪問時)、mtopはエラー "FAIL_SYS_TOKEN_EXOIRED:: token expired" を受け取り、mtopはクッキーに書き込むためのトークンを生成します(response .cookies)。
2番目のリクエストでは、jsはクッキー内のトークン値を読み取り、合意されたアルゴリズムに従ってサインを生成します。サインはmtopリクエストにもたらされ、mtopはクッキー内のトークンと同じ方法でサインを計算し、要求されたサインと比較します。チェックはパスし、apiアンサーを返します。失敗プロンプトは "FAIL_SYS_ILLEGAL_ACCESS:: illegal request" です。

新しいトークンが書き込まれる一方で、jsは新しいトークンを使ってサインを再計算し、リクエストを再送信します。
クッキー内のトークンのセルフチェックについては、トークンはクッキー内で平文になっており、偽造される可能性があるため、出力クッキーには非対称鍵公開鍵で暗号化されたトークンが含まれており、MTOPはまずクッキー内のトークンがリクエストごとにサーバーから割り当てられたかどうかをチェックします(暗号化されたトークンと秘密鍵を使ってトークンを復元して戻り値の平文トークンと比較します)。

記号が生成する

符号の生成式について。

md5Hex(token&t&appKey&data)

e.g.: md5Hex("30dc68e5b4cf40ebd02fb05673c7e3b7&1572522062317&12345678&{"itemNumId":"1502111132496" ;}")

sign=4c1e7b6853fa7a5e1b8f7066ee22932f

実装コードです。

public static String calcSignature(String token, String timestamp, String appKey, String data) {
        return DigestUtils.md5Hex(StringUtils.trimToEmpty(token) + "&"
                + timestamp + "&" + appKey + "&" + data);
    }

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



トークン

m_h5tk: explicit token_expireTime としてフォーマットされ、response.cookies から取得されます。

トークンは 30dc68e5b4cf40ebd02fb05673c7e3b7 です。
有効期限は1572522062317です。

トークンの保存を担当するクラスでラップすることができます。

@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.isEmpty(_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 (NumberFormatException 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.compare(o.getExpireTimestamp(), this.getExpireTimestamp());
    }
}



t
つまり、タイムスタンプは new Date().getTime() で取得される、という単純なものです。

アプリキー
固定値 パケットキャプチャツール経由のリクエストパラメータで利用可能、パラメータ名 appKey

データ
送信されたパラメータは、パケット取得ツールを介して、通常JSON文字列としてリクエストパラメータで利用可能です。

今回の記事は、タオバオH5サイン暗号化アルゴリズムについてです。淘宝網のH5符号の暗号化について、もっと詳しく知りたいなら、スクリプトハウスの過去の記事を検索してください、あるいは次の関連記事を引き続き閲覧してください、今後、スクリプトハウスをもっと支持することを願っています