Sending encrypted messages from Java to Javascript (Dutch) - Pjiwm/circle-project GitHub Wiki
De huidige situatie
Java heeft de ingebouwde encrypt functie Cipher.encrypt. Deze output een byte array. Deze Java methode leest de bytearray in als een set bits oftewel een signed bit array.
In Javascript zijn er een aantal packages die de data kunnen decrypten maar alle packages die we hebben opgezocht hebben problemen.
Node-rsa is een van de packages op Javascript waarmee je kan encrypten en decrypten. Encrypten met deze package en decrypten met Java werkt maar andersom niet, waarom is dit?
Java geeft dus een byteArray terug. Om deze gemakkelijk op te sturen wordt deze geëncode met Base64. In javascript wordt deze Base64 string omgezet naar een array met de Buffer functie. Zoals te lezen is in de documentatie: "The Buffer class is a subclass of JavaScript's Uint8Array class". Dit is dus een unsigned integer terwijl Java de data encode als een signed integer. Dit betekend dat integers boven negatieve getallen worden gelezen als positieve getallen waardoor de data niet overeenkomt.
Visuele versie van de uitleg
Er zijn packages, zoals Crypto-js, die geen buffer gebruiken voor het encrypten. Deze package heeft echter geen methode om te encrypten met een private key.
Er is een package genaamd cryptico die zowel zou encrypten als decrypten met een private key met een integer array als output. Deze package heeft echter geen ondersteuning voor het importeren van een PKCSx (x staat hier voor 1 of 8) keys. Het kan alleen keys importeren op basis van key primitieven.
Met deze problemen zou op het oog het wisselen van stack een oplossing zijn als we hier tijd voor zouden hebben. Dit lost het probleem echter niet op. Het grootste deel van onze stack is gebouwd op Javascript/Typescript. We wilden eerst de streaming applicatie ook hierin maken. Het probleem hiermee is echter dat er geen RTMP package bestaat voor de browser. De enige manier om vanuit de browser te streamen is webrtc, maar het streamen van webrtc naar een streaming server ondersteunen vrijwel alle streaming servers weer niet. Dit omdat webrtc wordt gezien als een video-conferencing protocol waar streamers meestal desktop applicaties als OBS of een andere native-app gebruikten. De oplossing hiervoor was het gebruik van een Android app waarmee we terug zijn bij het originele probleem.
Oplossing | PKSCx Key import | RTMP | Signed Int array | Private Key Encryption |
---|---|---|---|---|
Node-rsa - Java | Ja | Ja | Nee | Ja |
Crypto-js - Java | Ja | Ja | Ja | Nee |
Cryptico - Java | Nee | Ja | Ja | ?1 |
Node-rsa - Javascript | Ja | Nee | Ja | Ja |
1 Cryptico heeft incomplete documentatie
Wij hebben maar 1 oplossing kunnen bedenken voor dit probleem: het (deels) bouwen van een package. Als basis zouden we Node-rsa kunnen gebruiken en het om kunnen bouwen om geen Buffer te gebruiken. Gezien de tijd is dit echter niet mogelijk. Hierdoor kunnen wij geen berichten encrypten in Java en decrypten in Javascript. Omdat Java echter alles op bit niveau uitleest is de communicatie van Javascript naar Java wel veilig. De browser en de Javascript backend kunnnen natuurlijk wel veilig communiceren.