将Java HmacMD5函数转换为VB6
问题描述:
我正在开发一个Windows应用程序,并且需要使用一些以前的java代码中的一些auth函数。我有权访问Java源代码,但似乎无法正确使用它。可能是因为我有限的密码学知识。将Java HmacMD5函数转换为VB6
Java的功能,我需要转换为:
public String getHMACHash(String SharedSecretKey, String TextToHash) {
return base64EncodedStringFromBytes(hmacMD5(SharedSecretKey, TextToHash));
}
private String base64EncodedStringFromBytes(byte[] bArr) {
return Base64.encodeToString(bArr, 2);
}
public byte[] hmacMD5(String SharedSecretKey, String TextToHash) {
byte[] bArr = null;
try {
Mac instance = Mac.getInstance("HmacMD5");
instance.init(new SecretKeySpec(SharedSecretKey.getBytes(), "HmacMD5"));
bArr = instance.doFinal(TextToHash.getBytes());
} catch (NoSuchAlgorithmException e) {
Log.m8401e(TAG, e.getLocalizedMessage());
} catch (InvalidKeyException e2) {
Log.m8401e(TAG, e2.getLocalizedMessage());
}
return bArr;
}
所以输入值时:
SharedSecretKey = "497n9x98jK06gf7S3T7wJ2k455Qm192Q"
TextToHash = "1502322764327/customerservice.svc/buybackcartPOST8e802a045c1e60e"
哈希生成的是:
pOZNkg077OdvhyeMMPIX2w==
我尝试过,可能我使用VB6中的相同值无法靠近散列键。我尝试了几种不同的方法来创建哈希:
Private Function hash_HMACMD5(ByVal sTextToHash As String, ByVal
sSharedSecretKey As String)
Dim asc As Object, enc As Object
Dim TextToHash() As Byte
Dim SharedSecretKey() As Byte
Set asc = CreateObject("System.Text.UTF8Encoding")
Set enc = CreateObject("System.Security.Cryptography.HMACMD5")
TextToHash = asc.Getbytes_4(sTextToHash)
SharedSecretKey = asc.Getbytes_4(sSharedSecretKey)
enc.Key = SharedSecretKey
Dim bytes() As Byte
bytes = enc.ComputeHash_2((TextToHash))
hash_HMACMD5 = Base64Encode(bytes)
Set asc = Nothing
Set enc = Nothing
End Function
所以,我希望有人能够指出我在正确的方向吗?
谢谢提前寻求帮助。
Potman100
我已经通过跟踪所有的代码,我看不出这将表明不同的是怎么回事什么什么东西。如下面所提到的,有一个进口管线
import android.util.Base64;
创建哈希呼叫是:
String hMACHash = new MASecurity().getHMACHash(str, str2);
MASecurity类是:
import android.util.Base64;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class MASecurity {
private static final String TAG = "MASecurity";
public String getHMACHash(String str, String str2) {
return base64EncodedStringFromBytes(hmacMD5(str, str2));
}
private String base64EncodedStringFromBytes(byte[] bArr) {
return Base64.encodeToString(bArr, 2);
}
public byte[] hmacMD5(String str, String str2) {
byte[] bArr = null;
try {
Mac instance = Mac.getInstance("HmacMD5");
instance.init(new SecretKeySpec(str.getBytes(), "HmacMD5"));
bArr = instance.doFinal(str2.getBytes());
} catch (NoSuchAlgorithmException e) {
MALog.m8401e(TAG, e.getLocalizedMessage());
} catch (InvalidKeyException e2) {
MALog.m8401e(TAG, e2.getLocalizedMessage());
}
return bArr;
}
输入值是正确的,因为它们在应用程序运行时记录。
希望这有助于?
答
感谢Alex K.,似乎Java代码是将更多数据添加到其中一个参数中,我没有错过调试,我添加了额外的数据,它创建了一个有效的散列。
什么是'str1'和什么是'str2'。请像VB中那样使用像“text”和“secretKey”这样有意义的变量名,以便人们可以关注和理解你的代码。 –
嗨,我刚刚添加的代码,它是在旧的Java代码, str = SharedKey str2 = TextToHash 我将更新上面的代码。 – Potman100
从VB6我得到'0MQLYL4A9fH2 + o2Pb0PYJw =='和从Java我得到相同的:https://ideone.com/yHmaoQ - 唯一的区别是我使用'Base64.getEncoder()。encodeToString(bArr)'为你还没有说明你的代码里有什么'Base64'类型。因此,无论您使用的编码例程是做了一件意想不到的事情,还是'pOZNkg077OdvhyeMMPIX2w =='都是不同输入集合的散列。 –