Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Entwicklung
  4. Hash Methode aus Java in Javascript übersetzen

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.3k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.4k

Hash Methode aus Java in Javascript übersetzen

Geplant Angeheftet Gesperrt Verschoben Entwicklung
myaudijavahashsha512
3 Beiträge 2 Kommentatoren 419 Aufrufe 1 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • M Offline
    M Offline
    massa
    schrieb am zuletzt editiert von massa
    #1

    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: 3680E2E102C45655318BE5660D6E43DE7D7CA8FA733BFE983FC071BE5A7B5321

    Richtiger Ziel-Hash: DE11152A24ECD60104455FA1DC6F5D7A69BB7388B562BF2B2C22C2921B5DF9944F56563C57014FDD8F86670D7499CEB2F7682892528810874CC776112585960C

    AlCalzoneA 1 Antwort Letzte Antwort
    0
    • M massa

      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: 3680E2E102C45655318BE5660D6E43DE7D7CA8FA733BFE983FC071BE5A7B5321

      Richtiger Ziel-Hash: DE11152A24ECD60104455FA1DC6F5D7A69BB7388B562BF2B2C22C2921B5DF9944F56563C57014FDD8F86670D7499CEB2F7682892528810874CC776112585960C

      AlCalzoneA Offline
      AlCalzoneA Offline
      AlCalzone
      Developer
      schrieb am zuletzt editiert von AlCalzone
      #2

      @massa

      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. :)

      Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

      M 1 Antwort Letzte Antwort
      0
      • AlCalzoneA AlCalzone

        @massa

        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. :)

        M Offline
        M Offline
        massa
        schrieb am zuletzt editiert von
        #3

        @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 :)

        1 Antwort Letzte Antwort
        0
        Antworten
        • In einem neuen Thema antworten
        Anmelden zum Antworten
        • Älteste zuerst
        • Neuste zuerst
        • Meiste Stimmen


        Support us

        ioBroker
        Community Adapters
        Donate

        725

        Online

        32.4k

        Benutzer

        81.4k

        Themen

        1.3m

        Beiträge
        Community
        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
        ioBroker Community 2014-2025
        logo
        • Anmelden

        • Du hast noch kein Konto? Registrieren

        • Anmelden oder registrieren, um zu suchen
        • Erster Beitrag
          Letzter Beitrag
        0
        • Home
        • Aktuell
        • Tags
        • Ungelesen 0
        • Kategorien
        • Unreplied
        • Beliebt
        • GitHub
        • Docu
        • Hilfe