PHP Secure Connection RSA / AES Javascript

Da SSL nicht immer verfügbar ist, und ggf. doch sicher Daten ausgetauscht werden müssen, habe ich mich dazu entschlossen eine PHP und JavasScript Klasse zu bauen, die genau dies tut:

  • Serverseitig Public und Private key (RSA) generieren.
  • Public Key an den Client schicken
  • Client erstellt einen gemeinsamen Schlüssel und sendet ihn per RSA Verschlüsselung an den Server.
  • Ab jetzt erfolgt die Kommunikation AES verschlüsselt.
  • Der Server kann AES verschlüsselte HTML-Daten (texte, Divs etc.) übermitteln, der Client empfängt diese und entschlüsselt sie.
  • Der Client kann GET Parameter und POST Formulare verschlüsselt and den Server senden
  • Key Renewal und Connection Ping eingebaut.

Auf PHP Server-Seite braucht man fast nichts tun – auf Client Seite ebenfalls nicht.

Beispiel einer PHP Date auf dem Server, die HTML Generiert und ausgibt, sowie Daten empfängt.

<?php
 require_once("secon/secon.cls.inc.php");
 $secon = new secon();
?>
<html>
<!-- BEGIN SECON INCLUDE -->
 <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
 <script type="text/javascript" src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/pbkdf2.js"></script> <!-- Used for Key Generation and Salting --->
 <script type="text/javascript" src="secon/js/jsbn.js"></script> <!-- BigInt etc. Java Helper Tools --->
 <script type="text/javascript" src="secon/js/rsa2.js"></script> <!-- RSA Encryption --->
 <script type="text/javascript" src="secon/js/sha1.js"></script> <!-- Used SHA1 Hashing --->
 <script type="text/javascript" src="secon/js/aes.js"></script> <!-- AES Ecnryption --->
 <script type="text/javascript" src="secon/js/storage.js"></script> <!-- Browser Window Storage of Variables and Content --->
 <script type="text/javascript" src="secon/js/secon.js"></script> <!-- Secure Connection Class --->
 
 <!-- Activate Secon for this page and assign handlers -->
 <script type="text/javascript">
 var secon = new secon(); // Init Secon
 $( document ).ready(function() { // When loading is finished do
 secon.Ping(); // Initiate a Ping to check if Server and Client are OK.
 secon.DeCryptContent('.seconCrypted'); // Run Decrypting HTML Content deliverd by server, specify Jquery selector
 secon.AttachForms(".secon"); // Attach Secon Handler for secure Form - Transfer
 secon.AttachLinks(".secon"); // Attach Secon Handler for secure GET (Link) Transfer
 });
 </script> 
 
<!-- END SECON INCLUDE ---> 
 
 <body>
 <?php
 echo "<div class='seconCrypted'>";
 echo $secon->CryptText('Dies ist ein geheimer Text')
 echo "</div>"; 
 ?>
 </body>
</html>

Im Debug Fenster des Clients (Browser z.B. Chrome oder Firefox, kann man sehen, dass die Daten vershlüsselt werden und dann übertragen werden.form

Formular verschlüsselt senden

Das Formular wird verschlüsselt abgeschickt indem es einfach die Klasse .secon bekommt.

<form method="post" class="secon">

Normalerweise würden bei PHP die Daten in $_POST stehen. Da wir verschlüsselt übertragen stehen diese Daten in gleicher Form jedoch in $secon->DATA zur verfügung.

Parameter von Links verschlüsselt senden

Es ist einfach möglich Links wie zb. http://myserver.de/mydat.php?secret=1234&type=mode Verschlüsselt an den Server zu übertragen. Dazu muss der <a href link einfach die klasse secon bekommen.

<a href="index.php?mode=test&secret=1234&irgendwas=2" class="secon">My Link</a>

Im empfangenden PHP Script auf dem Server stehen die Daten dann ebenfalls in $secon->DATA zur verfügung.

Daten vom Server verschlüsselt an den Client senden:

Auch wird es notwendig sein bestimmte Daten vom Server in verschlüsselter Form an den Client zu transferieren. Die Daten müssen in einen Container z.B. DIV gepackt werden, da der Client per Javascript JQUERY Selector dann die Daten entschlüsselt. In dem Container dürfen dann nur verschlüsselte Daten stehen!

<div class="seconCrypted">
<?php echo $secon->CryptText('<b>My very secure data here...</b>');?>
</div>

 

Auf dem Client kommen die Daten dann wie unten zu sehen an und werden erst dort entschlüsselt und visualisiert:response

Auf diese Art könnte nicht nur ein DIV, sondern sogar der ganze Body verschlüsselt übertragen werden.

Secon Komplettpaket (PHP, JS und DEMO) als ZIP

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.