首页 > 解决方案 > Java (Android) 和 PHP 中的 HMAC_SHA256_BASE64

问题描述

我在 Java (Android) 中有这些代码: 这是第一个代码:

package com.shopee.live.livestreaming.network.encrypt;

import android.text.TextUtils;
import com.shopee.live.l.o.f.d;
import com.shopee.live.l.q.a;
import com.shopee.sz.reinforce.Aegis;
import com.shopee.sz.reinforce.AegisMethod;
import java.util.Locale;
import java.util.UUID;
import kotlin.TypeCastException;
import kotlin.jvm.internal.o;
import kotlin.jvm.internal.s;
import okhttp3.HttpUrl;
import okhttp3.Request;
import okhttp3.RequestBody;
import okio.c;

public final class EncryptHelper {
    public static final String ACCESS_KEY = "10001";
    public static final String BI_ZID = "ls";
    public static final Companion Companion = new Companion(null);
    public static final String FLAG_BOTTOM_LINE = "_";
    public static final String FLAG_LINE = "|";
    public static final String FLAG_RETURN = "\n";
    public static final String HEADER_KEY = "X-Livestreaming-Auth";
    public static final String PLATFORM = "android";
    public static final String VERSION = "v1";

    public static final class Companion {
        private Companion() {
        }

        public /* synthetic */ Companion(o oVar) {
            this();
        }
    }

    private final String buildAuthPrefix() {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(BI_ZID);
        stringBuffer.append(FLAG_BOTTOM_LINE);
        stringBuffer.append("android");
        stringBuffer.append(FLAG_BOTTOM_LINE);
        stringBuffer.append(VERSION);
        stringBuffer.append(FLAG_BOTTOM_LINE);
        stringBuffer.append(ACCESS_KEY);
        stringBuffer.append(FLAG_BOTTOM_LINE);
        d d = d.d();
        s.b(d, "SZNtpManager.getInstance()");
        stringBuffer.append(d.f());
        stringBuffer.append(FLAG_BOTTOM_LINE);
        stringBuffer.append(UUID.randomUUID());
        String stringBuffer2 = stringBuffer.toString();
        s.b(stringBuffer2, "StringBuffer()\n         …              .toString()");
        return stringBuffer2;
    }

    private final String buildPayload(Request request) {
        String str;
        String str2;
        HttpUrl url;
        String encodedQuery;
        HttpUrl url2;
        RequestBody body;
        c cVar = new c();
        if (!(request == null || (body = request.body()) == null)) {
            body.writeTo(cVar);
        }
        String Q = cVar.Q();
        if (!TextUtils.isEmpty(Q)) {
            Q = com.shopee.live.livestreaming.util.s.a(Q);
        }
        StringBuffer stringBuffer = new StringBuffer();
        String str3 = "";
        if (request == null || (str = request.method()) == null) {
            str = str3;
        }
        stringBuffer.append(str);
        stringBuffer.append("\n");
        if (request == null || (url2 = request.url()) == null || (str2 = url2.encodedPath()) == null) {
            str2 = str3;
        }
        stringBuffer.append(str2);
        stringBuffer.append("\n");
        stringBuffer.append(Q);
        stringBuffer.append("\n");
        if (!(request == null || (url = request.url()) == null || (encodedQuery = url.encodedQuery()) == null)) {
            Locale locale = Locale.getDefault();
            s.b(locale, "Locale.getDefault()");
            if (encodedQuery != null) {
                String lowerCase = encodedQuery.toLowerCase(locale);
                s.b(lowerCase, "(this as java.lang.String).toLowerCase(locale)");
                if (lowerCase != null) {
                    str3 = lowerCase;
                }
            } else {
                throw new TypeCastException("null cannot be cast to non-null type java.lang.String");
            }
        }
        stringBuffer.append(str3);
        String stringBuffer2 = stringBuffer.toString();
        s.b(stringBuffer2, "StringBuffer()\n         …              .toString()");
        return stringBuffer2;
    }

    public final String buildAuthorization(Request request) {
        String buildAuthPrefix = buildAuthPrefix();
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(buildAuthPrefix);
        stringBuffer.append("\n");
        stringBuffer.append(buildPayload(request));
        String stringBuffer2 = stringBuffer.toString();
        s.b(stringBuffer2, "StringBuffer()\n         …              .toString()");
        return buildAuthPrefix + FLAG_LINE + Aegis.fire(AegisMethod.AEGIS_HMAC_SHA256_BASE64, stringBuffer2, "");
    }

    public final Request buildEncryptHeader(Request request) {
        String str;
        String str2;
        Request.Builder newBuilder;
        Request.Builder header;
        Request.Builder method;
        String str3 = "";
        try {
            String buildAuthPrefix = buildAuthPrefix();
            try {
                StringBuffer stringBuffer = new StringBuffer();
                stringBuffer.append(buildAuthPrefix);
                stringBuffer.append("\n");
                stringBuffer.append(buildPayload(request));
                str = stringBuffer.toString();
            } catch (Throwable unused) {
                str = str3;
                str3 = buildAuthPrefix;
                str2 = str;
                a.k(new Exception("request param is " + str3 + " and request body is " + str + " and encrypt result is " + str2), "encrypt error");
                return request;
            }
            try {
                String str4 = buildAuthPrefix + FLAG_LINE + Aegis.fire(AegisMethod.AEGIS_HMAC_SHA256_BASE64, str, str3);
                if (!TextUtils.isEmpty(str4)) {
                    if (request == null || (newBuilder = request.newBuilder()) == null || (header = newBuilder.header(HEADER_KEY, str4)) == null || (method = header.method(request.method(), request.body())) == null) {
                        return null;
                    }
                    return method.build();
                }
            } catch (Throwable unused2) {
                str2 = str3;
                str3 = buildAuthPrefix;
                a.k(new Exception("request param is " + str3 + " and request body is " + str + " and encrypt result is " + str2), "encrypt error");
                return request;
            }
        } catch (Throwable unused3) {
            str2 = str3;
            str = str2;
            a.k(new Exception("request param is " + str3 + " and request body is " + str + " and encrypt result is " + str2), "encrypt error");
            return request;
        }
        return request;
    }
}

这是第二个代码:

package com.shopee.sz.reinforce;

import android.text.TextUtils;
import com.shopee.leego.vaf.expr.engine.executor.ArithExecutor;
import java.io.UnsupportedEncodingException;

public class Aegis {
    private static final a libraryLoader = new a("shopeeaegis");

    private static String convertByteArrayToHex(byte[] bArr) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bArr) {
            String hexString = Integer.toHexString(b & ArithExecutor.TYPE_None);
            if (hexString.length() == 1) {
                hexString = "0" + hexString;
            }
            sb.append(hexString);
        }
        return sb.toString();
    }

    public static String fire(AegisMethod aegisMethod, String str, String str2) {
        if (!TextUtils.isEmpty(str) && libraryLoader.a()) {
            try {
                byte[] fire = fire(aegisMethod.ordinal(), str.getBytes("UTF-8"), str2.getBytes("UTF-8"));
                if (fire == null) {
                    return null;
                }
                if (!(aegisMethod == AegisMethod.AEGIS_B64 || aegisMethod == AegisMethod.AEGIS_AES_CBC_B64 || aegisMethod == AegisMethod.AEGIS_IV_AES_CBC_B64 || aegisMethod == AegisMethod.AEGIS_HMAC_SHA256_BASE64)) {
                    if (aegisMethod != AegisMethod.AEGIS_HMAC_SHA1_BASE64) {
                        return convertByteArrayToHex(fire);
                    }
                }
                return new String(fire);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    private static native byte[] fire(int i2, byte[] bArr);

    private static native synchronized byte[] fire(int i2, byte[] bArr, byte[] bArr2);

    public static String fire(AegisMethod aegisMethod, String str) {
        if (!TextUtils.isEmpty(str) && libraryLoader.a()) {
            try {
                byte[] fire = fire(aegisMethod.ordinal(), str.getBytes("UTF-8"));
                if (fire == null) {
                    return null;
                }
                if (!(aegisMethod == AegisMethod.AEGIS_B64 || aegisMethod == AegisMethod.AEGIS_AES_CBC_B64)) {
                    if (aegisMethod != AegisMethod.AEGIS_IV_AES_CBC_B64) {
                        return convertByteArrayToHex(fire);
                    }
                }
                return new String(fire);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

他们生成“X-Livestreaming-Auth”。如何在 PHP 中生成它?例如,我的 PHP 不起作用:

<?php
$stringBuffer2 = "ls_android_v1_10001_1634011195_08b286b3-f913-458a-abe2-4c6150b74e6e
GET
/api/v1/session/1827498/coin/user_config
uid=146879002";
echo "ls_android_v1_10001_1634011195_08b286b3-f913-458a-abe2-4c6150b74e6e|".base64_encode(hash_hmac("sha256",$stringBuffer2,"",true));

Java的结果是:

ls_android_v1_10001_1634011195_08b286b3-f913-458a-abe2-4c6150b74e6e|rGYeKSM5JkzwAsA8P4o/0SPVkeNts5oWPUqzB7LFB74=

但从 PHP 是:

ls_android_v1_10001_1634011195_08b286b3-f913-458a-abe2-4c6150b74e6e|qtEND/yfwZEdVM5ZM+4SymGTM9lWfnY22XGeuun5S0g=

标签: javaphpandroidsha256hmac

解决方案


推荐阅读