gpt4 book ai didi

一个app上的java解密,反编译源代码

转载 作者:行者123 更新时间:2023-12-02 09:05:21 25 4
gpt4 key购买 nike

在检查了这段代码几个小时后,我对发生的事情有了一点了解,但我来自 python,这是完全不同的。

我刚刚查找了诸如 StringBuilder 之类的基本内容,并且可以理解它很简单。对于某些人来说,这可能是一个简单的哈希算法,但这是我第一次尝试类似 public Final String getSignature(String paramString1, String paramString2) 的方法,这是我部分使用的方法/函数理解。它获取电子邮件和时间戳,并将它们添加到带有 : 的字符串生成器中。

然而,这(至少我认为)不可能是创建请求中使用的签名所需的唯一函数,因此这让我想到了下一个问题:所有其他函数都在做什么,比如为什么在第一个函数中函数是否将 "" 附加到 StringBuilder 中,这对我来说似乎毫无意义,第一个函数中的 ParamString 是什么。

我的总体问题是它是如何工作的?我已经查看了这段代码至少 2 个小时,感觉没有任何进展。像 Charset charset = Charsets.UTF_8; 这样的东西绝对是不言自明的,但是像 Intrinsics.checkExpressionValueIsNotNull(arrayOfByte2, "(this as java.lang.String).getBytes(charset)"这样的东西); 不是而且很难理解。

这是文件 Signature.class 中的所有代码,所以我确信这就是所有代码。我并不是要求对所有事情进行详分割析。我最困惑的是如何在方法/函数上使用参数。例如,我如何判断 public Signature(String paramString) 中的 String paramString 是什么。我知道我在整个过程中问了很多问题,但这是我最想得到答案的一个。我在任何类型的哈希方面也没有经验。

我可以轻松使用的唯一编码类型是base64,它并不是真正为了安全起见,它只是数据库的通用语言。我试图放弃仅仅为了这一件事而学习另一种语言,但我也觉得这绝对可以帮助我在未来的几年里处理其他事情。这也是我第一次反编译东西。

package com.loke.tidy.rest;

import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.util.Formatter;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import kotlin.TypeCastException;
import kotlin.jvm.internal.Intrinsics;
import kotlin.text.Charsets;

public final class Signature {
private byte[] key;

public Signature(String paramString) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("");
stringBuilder.append(paramString);
stringBuilder.append(":f780e905a457f84ffc7c1d5d953bc0d2");
this.key = getSha1(stringBuilder.toString());
}

private final byte[] createHmac(byte[] paramArrayOfbyte1, byte[] paramArrayOfbyte2, String paramString) {
SecretKeySpec secretKeySpec = new SecretKeySpec(paramArrayOfbyte2, paramString);
Mac mac = Mac.getInstance(paramString);
mac.init(secretKeySpec);
paramArrayOfbyte1 = mac.doFinal(paramArrayOfbyte1);
Intrinsics.checkExpressionValueIsNotNull(paramArrayOfbyte1, "mac.doFinal(data)");
return paramArrayOfbyte1;
}

private final String toHexString(byte[] paramArrayOfbyte) {
Formatter formatter = new Formatter();
int j = paramArrayOfbyte.length;
for (int i = 0; i < j; i++) {
formatter.format("%02x", new Object[] { Byte.valueOf(paramArrayOfbyte[i]) });
}
String str = formatter.toString();
Intrinsics.checkExpressionValueIsNotNull(str, "formatter.toString()");
return str;
}

public final byte[] getKey() {
return this.key;
}

public final byte[] getSha1(String paramString) {
Intrinsics.checkParameterIsNotNull(paramString, "text");
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
byte[] arrayOfByte2 = paramString.getBytes(Charsets.UTF_8);
Intrinsics.checkExpressionValueIsNotNull(arrayOfByte2, "(this as java.lang.String).getBytes(charset)");
messageDigest.update(arrayOfByte2, 0, paramString.length());
byte[] arrayOfByte1 = messageDigest.digest();
Intrinsics.checkExpressionValueIsNotNull(arrayOfByte1, "md.digest()");
return arrayOfByte1;
}

public final String getSignature(String paramString1, String paramString2) {
Intrinsics.checkParameterIsNotNull(paramString1, "email");
Intrinsics.checkParameterIsNotNull(paramString2, "timestamp");
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("");
stringBuilder.append(paramString2);
stringBuilder.append(':');
stringBuilder.append(paramString1);
paramString1 = stringBuilder.toString();
Charset charset = Charsets.UTF_8;
if (paramString1 == null)
throw new TypeCastException("null cannot be cast to non-null type java.lang.String");
byte[] arrayOfByte = paramString1.getBytes(charset);
Intrinsics.checkExpressionValueIsNotNull(arrayOfByte, "(this as java.lang.String).getBytes(charset)");
return toHexString(createHmac(arrayOfByte, this.key, "HmacSHA1"));
}

public final void setKey(byte[] paramArrayOfbyte) {
Intrinsics.checkParameterIsNotNull(paramArrayOfbyte, "<set-?>");
this.key = paramArrayOfbyte;
}
}```


最佳答案

这似乎是一个用于生成 MAC(消息验证代码)的类......松散的数字签名。该 API 提供:

  • 一个构造函数,它使用用户提供的字符串实例化一个Signature,该字符串与“魔数(Magic Number)”组合并用于生成 key 。

  • 用于为(显然)电子邮件(或电子邮件地址)和时间戳生成签名的公共(public)方法。签名被编码为十六进制字符串。

  • 用于生成文本 SHA1 哈希值的公共(public)方法。这是内部使用的。它可能是无意或故意暴露在 API 中的。

它是如何工作的?

重要的部分只是对标准 Java 加密类的调用;例如SHA1 摘要创建器和 HMAC 生成器。 (HMAC 是基于哈希的 MAC。)您应该能够通过阅读各个类的 javadoc 并将它们与它们的使用方式进行比较来弄清楚发生了什么:

  • java.crypto.Mac ( javadoc )
  • javax.crypto.spec.SecretKeySpec ( javadoc )

等等。

涉及Intrinsics的神秘内容可以安全地忽略(IMO)。看来这段 Java 代码实际上是反编译的 Kotlin 代码。对 Intrinsics 的调用正在对 Kotlin 参数和值实现各种运行时检查。例如,我的猜测是对 checkExpressionValueIsNotNull 的调用将检查第一个参数是否不为空。如果它是null,它可能会抛出一个异常,其中包含异常消息中的第二个参数。 (您可能可以追查这一点,但我怀疑这是否值得付出努力。)

<小时/>

This is also the first time I have ever decompiled something.

您最好查看原始的 Kotlin 源代码。理解反编译代码通常涉及一定程度的猜测,以找出变量的含义/含义,并找出反编译代码中可能的错误和不直观的翻译。您还需要能够读取反编译器的目标语言。在本例中是Java。

阅读原始源代码要容易得多。

关于一个app上的java解密,反编译源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59853309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com