NEWS
Hash Methode aus Java in Javascript übersetzen
-
Hallo zusammen,
ich arbeite gerade an einem aktualisierten myAudi Adapter. Ich stehe nun vor der Herausforderung drei Java Methode (aus der myAudi APK extrahiert) in Javascript zu übersetzen, um diese für den iobroker zu nutzen! Folgende zwei Methoden habe ich bereits gefunden:
JAVA Original Methoden:
static byte[] hexToBytes( String str) { byte[] bArr = new byte[(str.length() / 2)]; int i = 0; while (i < str.length()) { int i2 = i + 2; bArr[i / 2] = (byte) Integer.parseInt(str.substring(i, i2), 16); i = i2; } return bArr; } static String bytesToHex( byte[] bArr) { char[] cArr = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; char[] cArr2 = new char[(bArr.length * 2)]; for (int i = 0; i < bArr.length; i++) { int b = bArr[i] & 255; //byte int i2 = i * 2; cArr2[i2] = cArr[b >>> 4]; cArr2[i2 + 1] = cArr[b & 15]; } return new String(cArr2); }
Javascript Übersetzung:
function hexToBytes(hex) { for (var bytes = [], c = 0; c < hex.length; c += 2){ bytes.push(parseInt(hex.substr(c, 2), 16)); } adapter.log.info(bytes); return bytes; } // Convert a byte array to a hex string function bytesToHex(bytes) { for (var hex = [], i = 0; i < bytes.length; i++) { var current = bytes[i] < 0 ? bytes[i] + 256 : bytes[i]; hex.push((current >>> 4).toString(16)); hex.push((current & 0xF).toString(16)); } return hex.join(""); }
Mein eigentliches Problem besteht nun darin, dass ich in der Hash Methode nie auf das richtige Ergebnis komme, da Javascript mit den Typen und Hashing anders umgeht als Java. So sieht die Hash Methode in Java aus:
static String hashPinV2( String str, String str2) { try { byte[] hexToBytes = hexToBytes(str); byte[] hexToBytes2 = hexToBytes(str2); byte[] bArr = new byte[(hexToBytes.length + hexToBytes2.length)]; System.arraycopy(hexToBytes, 0, bArr, 0, hexToBytes.length); System.arraycopy(hexToBytes2, 0, bArr, hexToBytes.length, hexToBytes2.length); return bytesToHex(MessageDigest.getInstance("SHA-512").digest(bArr)); } catch (Exception e) { System.err.println("ERROR"); } return "1"; }
Hat jemand einen Tipp was genau ich tun muss, um das in Javascript umzusetzen? Ich habe schon eine ganze Menge ausprobiert, aber komme einfach nicht weiter... Übrigens ist es natürlich nicht wichtig genau die gleichen Methodne zu benutzen. Also wenn jemand einen anderen Weg kennt und auf das gleiche Ergebnis kommt ist das genauso gut
Folgende Test-Werte benutze ich:
hashPinV2(Test-Pin,Test-Challenge)
Test-Pin: 3364
Test-Challenge: 3680E2E102C45655318BE5660D6E43DE7D7CA8FA733BFE983FC071BE5A7B5321Richtiger Ziel-Hash: DE11152A24ECD60104455FA1DC6F5D7A69BB7388B562BF2B2C22C2921B5DF9944F56563C57014FDD8F86670D7499CEB2F7682892528810874CC776112585960C
-
Um zwischen Hex-Strings und Byte-Arrays umzuwandeln, nutzt man in JS die Buffer-Klasse, die netterweise auch direkt von den Crypto-Methoden benötigt wird:
const bufFromHex = Buffer.from(hexString, "hex"); const bufToHex = bufFromHex.toString("hex");
Die Node.JS-Doku sollte helfen bei der Hash-Methode https://nodejs.org/api/crypto.html#crypto_hash_digest_encoding
Habe das mal auf der Konsole ausprobiert:> const crypto = require('crypto'); undefined > const hash = crypto.createHash("sha512") undefined > const buf1 = Buffer.from("3364", "hex") undefined > const buf2 = Buffer.from("3680E2E102C45655318BE5660D6E43DE7D7CA8FA733BFE983FC071BE5A7B5321", "hex") undefined > const buf = Buffer.concat([buf1, buf2]) undefined > hash.update(buf) Hash { _options: undefined, writable: true, readable: true, [Symbol(kHandle)]: {}, [Symbol(kState)]: { [Symbol(kFinalized)]: false } } > hash.digest("hex") 'de11152a24ecd60104455fa1dc6f5d7a69bb7388b562bf2b2c22c2921b5df9944f56563c57014fdd8f86670d7499ceb2f7682892528810874cc776112585960c'
Sieht gut aus, musst nur noch den String in uppercase transformieren.
-
@AlCalzone wen haben wir denn da
Vielen Dank!!
Ich habe die letzten Tage mit diesem Rätsel verbracht und war schon echt am verzweifeln... So klappt es!
Dann kann es ja weitergehen