应用程序上的Java解密,反编译源代码

应用程序上的Java解密,反编译源代码,java,Java,在对这段代码进行了几个小时的研究之后,我对正在发生的事情有了一点想法,但是我来自python,这是完全不同的 我只是查了一些基本的东西,比如StringBuilder,我能理解这很简单。对某些人来说,这可能是一个简单的哈希算法,但这是我第一次尝试类似于public final String getSignature(String paramString1,String paramString2),这是我部分理解的方法/函数。它获取电子邮件和时间戳,并将它们添加到字符串生成器中,其中包含: 然而,

在对这段代码进行了几个小时的研究之后,我对正在发生的事情有了一点想法,但是我来自python,这是完全不同的

我只是查了一些基本的东西,比如StringBuilder,我能理解这很简单。对某些人来说,这可能是一个简单的哈希算法,但这是我第一次尝试类似于
public final String getSignature(String paramString1,String paramString2)
,这是我部分理解的方法/函数。它获取电子邮件和时间戳,并将它们添加到字符串生成器中,其中包含:

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

我的总体问题是这是如何工作的?我已经看了这段代码至少两个小时了,我觉得没有任何进展。比如
Charset Charset=Charsets.UTF_8
显然是自解释的,但诸如
Intrinsics.checkExpressionValueIsNotNull(arrayOfByte2),(这是java.lang.String.getBytes(charset)”不是而且很难理解

这是文件
Signature.class
中的所有代码,因此我确信这是所有代码。我不是要把每件事都分解。我最困惑的是参数是如何在方法/函数上使用的。例如,我如何判断
公共签名(String paramString)
中的字符串paramString是什么。我知道我问了很多问题,但这是我最想回答的问题。我也没有任何散列的经验

我唯一可以轻松使用的编码类型是base64,它并不是真正为了安全,它只是dbs的通用语言。我试着为了这一件事而放弃学习另一种语言,但我也觉得这肯定会在我未来的岁月里对我的其他事情有所帮助。这也是我第一次反编译一些东西

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;
  }
}```


package com.loke.tidy.rest;
导入java.nio.charset.charset;
导入java.security.MessageDigest;
导入java.util.Formatter;
导入javax.crypto.Mac;
导入javax.crypto.spec.SecretKeySpec;
导入kotlin.TypeCastException;
导入kotlin.jvm.internal.Intrinsics;
导入kotlin.text.charset;
公开最终类签名{
专用字节[]密钥;
公共签名(字符串参数字符串){
StringBuilder StringBuilder=新的StringBuilder();
stringBuilder.append(“”);
stringBuilder.append(paramString);
stringBuilder.append(“:f780e905a457f84ffc7c1d5d953bc0d2”);
this.key=getSha1(stringBuilder.toString());
}
私有最终字节[]createHmac(字节[]paramArrayOfbyte1,字节[]paramArrayOfbyte2,字符串paramString){
SecretKeySpec SecretKeySpec=新SecretKeySpec(paramArrayOfbyte2,paramString);
Mac Mac=Mac.getInstance(paramString);
mac.init(secretKeySpec);
paramArrayOfbyte1=mac.doFinal(paramArrayOfbyte1);
Intrinsics.checkExpressionValueIsNotNull(paramArrayOfbyte1,“mac.doFinal(数据)”;
返回参数arrayOfByte1;
}
私有最终字符串toHexString(字节[]paramArrayOfbyte){
格式化程序格式化程序=新格式化程序();
int j=paramaryOfByte.length;
对于(int i=0;i
您已经反编译了字节码,这是编译Kotlin源代码而不是java源代码的结果。基本上,这些内部调用检查第一个参数是否为null;如果是,则抛出包含第二个参数的消息的异常。最好是阅读原始源代码,而不是尝试去联机。

这似乎是一个用于生成MAC(消息身份验证代码)的类。。。不严格地说,是数字签名。API提供了:

  • 用用户提供的字符串th实例化签名的构造函数