java - 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=
解决方案
推荐阅读
- java - 同一实体错误的多种表示
- c# - 不确定如何正确地将数据提取到包含字符串、int 和 double 属性的类列表中
- python - 如何从烧瓶启动和停止子进程
- php - 外键约束的格式不正确。你能帮助我吗?
- c# - 如何使用正文表单数据在 Xamarin C# url 中获取数据
- azure - 在 Powershell 中获取 Azure HybridWorker 环境变量
- gis - 拆分资产:管理资产 ID 和相关记录的选项
- c# - 线程问题 - 阻塞 UI 线程
- javascript - 如何在页面加载时隐藏我的 amcharts3 饼图的一部分
- asp.net-core - ASP.NET 核心 2.2。Razor Pages - 如何根据另一个字段填充表单控件