Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Passwort RSA encryption

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Passwort RSA encryption

    Hallo,

    ich habe ein Problem beim nachprogrammieren eines Skriptes von Javascript zu PHP.
    Es geht um die Verschlüsselung eines Passwortes beim Login auf die Seite.

    Beim absenden des Formulars wird die Funktion DoLogin aufgerufen.
    Code:
    function DoLogin()
    {
    	var form = document.forms['logon'];
    
    	var username = form.elements['username'].value;
    	username = username.replace( /[^\x00-\x7F]/g, '' ); // remove non-standard-ASCII characters
    	
    	var password = form.elements['password'].value;
    	password = password.replace( /[^\x00-\x7F]/g, '' ); // remove non-standard-ASCII characters
    
    	if ( g_bLoginInFlight || password.length == 0 || username.length == 0 )
    		return;
    
    	g_bLoginInFlight = true;
    	$('login_btn_signin').hide();
    	$('login_btn_wait').show();
    	
    	new Ajax.Request( 'https://steamcommunity.com/login/getrsakey/',
    		{
    			method: 'post',
    			parameters: {
    				username: username,
    				donotcache: ( new Date().getTime() )
    			},
    			onSuccess: OnRSAKeyResponse,
    			onException: function( req, e ) {
    				throw e;
    			}
    		}
    	);
    }
    
    // g_sAuthCode == ""; Also eigentlich unnötig
    function getAuthCode( results )
    {
    	var authCode = g_sAuthCode;
    	g_sAuthCode = '';
    	return authCode;
    }
    
    function OnRSAKeyResponse( transport )
    {
    	var results = transport.responseJSON;
    	if ( results.publickey_mod && results.publickey_exp && results.timestamp )
    	{
    		var form = document.forms['logon'];
    
    		var pubKey = RSA.getPublicKey( results.publickey_mod, results.publickey_exp );
    		var username = form.elements['username'].value;
    		username = username.replace( /[^\x00-\x7F]/g, '' ); // remove non-standard-ASCII characters
    		var password = form.elements['password'].value;
    		password = password.replace( /[^\x00-\x7F]/g, '' ); // remove non-standard-ASCII characters
    		var encryptedPassword = RSA.encrypt( password, pubKey );
    
    		new Ajax.Request( 'https://steamcommunity.com/login/dologin/',
    			{
    				method: 'post',
    				parameters: {
    					password: encryptedPassword,
    					username: username,
    					twofactorcode: getAuthCode( results ),
    					emailauth: form.elements['emailauth'].value,
    					loginfriendlyname: form.elements['loginfriendlyname'].value,
    										captchagid: form.elements['captchagid'].value,
    					captcha_text: form.elements['captcha_text'].value,
    					emailsteamid: form.elements['emailsteamid'].value,
    					rsatimestamp: results.timestamp,
    					remember_login: ( form.elements['remember_login'] && form.elements['remember_login'].checked ) ? 'true' : 'false',
    					donotcache: ( new Date().getTime() )
    				},
    				onSuccess: OnLoginResponse,
    				onException: function( req, e ) {
    							throw e;
    						}
    			}
    		);
    	}
    	else
    	{
    		if ( results.message )
    		{
    			HighlightFailure( results.message );
    		}
    
    		$('login_btn_signin').show();
    		$('login_btn_wait').hide();
    
    		g_bLoginInFlight = false;
    	}
    }
    Die Funktion DoLogin() holt sich dann eine Datei, mit deren Inhalt man den Public Key zum verschlüsseln des Passwortes berrechnen kann. Der Inhalt dieser Datei lautet ungefär so:
    Code:
    {
    	"success":true,
    	"publickey_mod":"CDCAD0C1229896D1937E2AC21F2D9ECDD2F7232179001235F1A6337E87DC0E11030A635381AF178AABA5EFB41B5538E27B40B79B35A39AEDEFA16B27B15D3D83754ED4F9AD3C4AB072CA4FACEE726B86D09B2E5F23BFD5A66558F425BA6E74CCC689B12FB9A4295706F7C48506F78C32C98BA2E992ADBFC4474976A0CCFB4121A3D483DE5055A61046FEBBEBD43C32A64F05B79CCBC3D7441A53F2A6E07717115A68AF07BA45699D72CC2223D1FC19F2A9F07DBEE8E9A37AC493379B2A9E6C4CB2929C6F77F00CC59B452295F09EFA63E684414CD45B672C356D498F7A9E3F6F9F00C5D77FC5CFD6BD610B93FE012AF7C266E17D31AD3D5816F48088ED3179F1",
    	"publickey_exp":"010001",
    	"timestamp":"410631150000",
    	"token_gid":"2e9201d5d727afe"
    }
    Wenn der Ajax Request erfolgreich ausgeführt wurde, wird die Funktion OnRSAKeyResponse() aufgerufen. Diese verschlüsselt das Passwort und fragt ab ob die Angegebenen Daten korrekt sind.
    Mein Problem liegt in der Verschlüsselung des Passwortes. Die Javascript Klasse zum verschlüsselnd lautet so:
    Code:
    var RSAPublicKey = function($modulus_hex, $encryptionExponent_hex) {
        this.modulus = new BigInteger( $modulus_hex, 16);
        this.encryptionExponent = new BigInteger( $encryptionExponent_hex, 16);
    }
    
    var Base64 = {
        base64: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
        encode: function($input) {
            if (!$input) {
                return false;
            }
            var $output = "";
            var $chr1, $chr2, $chr3;
            var $enc1, $enc2, $enc3, $enc4;
            var $i = 0;
            do {
                $chr1 = $input.charCodeAt($i++);
                $chr2 = $input.charCodeAt($i++);
                $chr3 = $input.charCodeAt($i++);
                $enc1 = $chr1 >> 2;
                $enc2 = (($chr1 & 3) << 4) | ($chr2 >> 4);
                $enc3 = (($chr2 & 15) << 2) | ($chr3 >> 6);
                $enc4 = $chr3 & 63;
                if (isNaN($chr2)) $enc3 = $enc4 = 64;
                else if (isNaN($chr3)) $enc4 = 64;
                $output += this.base64.charAt($enc1) + this.base64.charAt($enc2) + this.base64.charAt($enc3) + this.base64.charAt($enc4);
            } while ($i < $input.length);
            return $output;
        },
        decode: function($input) {
            if(!$input) return false;
            $input = $input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
            var $output = "";
            var $enc1, $enc2, $enc3, $enc4;
            var $i = 0;
            do {
                $enc1 = this.base64.indexOf($input.charAt($i++));
                $enc2 = this.base64.indexOf($input.charAt($i++));
                $enc3 = this.base64.indexOf($input.charAt($i++));
                $enc4 = this.base64.indexOf($input.charAt($i++));
                $output += String.fromCharCode(($enc1 << 2) | ($enc2 >> 4));
                if ($enc3 != 64) $output += String.fromCharCode((($enc2 & 15) << 4) | ($enc3 >> 2));
                if ($enc4 != 64) $output += String.fromCharCode((($enc3 & 3) << 6) | $enc4);
            } while ($i < $input.length);
            return $output; 
        }
    };
    
    var Hex = {
        hex: "0123456789abcdef",
        encode: function($input) {
            if(!$input) return false;
            var $output = "";
            var $k;
            var $i = 0;
            do {
                $k = $input.charCodeAt($i++);
                $output += this.hex.charAt(($k >> 4) &0xf) + this.hex.charAt($k & 0xf);
            } while ($i < $input.length);
            return $output;
        },
        decode: function($input) {
            if(!$input) return false;
            $input = $input.replace(/[^0-9abcdef]/g, "");
            var $output = "";
            var $i = 0;
            do {
                $output += String.fromCharCode(((this.hex.indexOf($input.charAt($i++)) << 4) & 0xf0) | (this.hex.indexOf($input.charAt($i++)) & 0xf));
            } while ($i < $input.length);
            return $output;
        }
    };
    
    var RSA = {
    
        getPublicKey: function( $modulus_hex, $exponent_hex ) {
    		return new RSAPublicKey( $modulus_hex, $exponent_hex );
        },
    
        encrypt: function($data, $pubkey) {
            if (!$pubkey) return false;
            $data = this.pkcs1pad2($data,($pubkey.modulus.bitLength()+7)>>3);
            if(!$data) return false;
            $data = $data.modPowInt($pubkey.encryptionExponent, $pubkey.modulus);
            if(!$data) return false;
            $data = $data.toString(16);
            if(($data.length & 1) == 1)
                $data = "0" + $data;
            return Base64.encode(Hex.decode($data));
        },
    
        pkcs1pad2: function($data, $keysize) {
            if($keysize < $data.length + 11)
                return null;
            var $buffer = [];
            var $i = $data.length - 1;
            while($i >= 0 && $keysize > 0)
                $buffer[--$keysize] = $data.charCodeAt($i--);
            $buffer[--$keysize] = 0;
            while($keysize > 2)
                $buffer[--$keysize] = Math.floor(Math.random()*254) + 1;
            $buffer[--$keysize] = 2;
            $buffer[--$keysize] = 0;
            return new BigInteger($buffer);
        }
    }
    Ich benutze die phpseclib für die Klassen RSA und BigInteger.
    Mein bisherger PHP Code Lautet so:
    PHP-Code:
    <?php

    INCLUDE("Crypt/RSA.php");
    INCLUDE(
    "Math/BigInteger.php");

    $login "einBenutzername";
    $password "einPasswort";

    function 
    geturl($url$ref$cookie$postdata$header, &$info, &$output) {
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL$url);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    curl_setopt ($chCURLOPT_SSL_VERIFYPEER0);
        
    curl_setopt ($chCURLOPT_SSL_VERIFYHOST0);
        
    curl_setopt ($chCURLOPT_USERAGENT'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36');
        if (
    $ref)
        {
            
    curl_setopt($chCURLOPT_REFERER$ref);
        }
        if (
    $cookie)
        {
            
    curl_setopt($chCURLOPT_COOKIE$cookie);
        }

        if (
    $postdata)
        {
            
    curl_setopt($chCURLOPT_POSTtrue);
            
    $postStr "";
            foreach (
    $postdata as $key => $value)
            {
                if (
    $postStr) {
                    
    $postStr .= "&";
                }
                
    $postStr .= $key "=" $value;
            }
            
    curl_setopt($chCURLOPT_POSTFIELDS$postStr);
        }

        
    curl_setopt($chCURLOPT_HEADER$header);
        
    $info curl_getinfo($ch);
        
    $output curl_exec($ch);
        
    curl_close($ch);
    }

    geturl("https://steamcommunity.com/login/getrsakey"NULLNULL, array('username' => $login"donotcache" => time()), 0$info$output);
    $data json_decode($outputtrue);

    if(
    $data['success'] === true) {
        
    $publickey_exp $data['publickey_exp'];
        
    $publickey_mod $data['publickey_mod'];

        
    $RSA = new Crypt_RSA();
        
    $RSA->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
        
    $n = new Math_BigInteger($publickey_mod16);
        
    $e = new Math_BigInteger($publickey_exp16);

        
    $key = array("modulus"=>$n"publicExponent"=>$e);
        
    $RSA->loadKey($keyCRYPT_RSA_PUBLIC_FORMAT_RAW);
        
    $encryptedPassword base64_encode($RSA->encrypt($password));

        
    $params = array(
            
    'username' => $login,
            
    'password' => $encryptedPassword,
            
    'rsatimestamp' => $data['timestamp'],
            
    'captcha_gid' => -1,
            
    'captcha_text' => "",
            
    'emailauth' => "",
            
    'emailsteamid' => "",
            
    'remember_login' => true,
            
    'twofactorcode' => "",
            
    'loginfriendlyname' => ""
        
    );

        
    geturl("https://steamcommunity.com/login/dologin/"NULLNULL$params0$info$output);
        
    $data json_decode($outputtrue);
        
    var_dump($data);
        if (
    $data['captcha_needed']) {
            
    $captchaGid $data['captcha_gid'];
            echo 
    '<img src="https://steamcommunity.com/public/captcha.php?gid=' $captchaGid '">';
        }
    }
    Ich bekomme immer diese Meldung:
    Code:
    array(5) { ["success"]=> bool(false) ["requires_twofactor"]=> bool(false) ["captcha_needed"]=> bool(false) ["captcha_gid"]=> int(-1) ["message"]=> string(15) "Incorrect login" }
    Da ich weiß, dass meine Daten stimmen, kann nur die Passwort Verschlüsselung falsch sein.
    Ich kenne mich leider mit Javascript nicht so gut aus, deswegen versteh ich einige Sachen nicht richtig.

    Ich würde mich über Hilfe freuen.

    MFG
    DoNotClick


  • #2
    Aus deinen Informationen kann man leider nur das sagen, dass du irgendwo einen Fehler hast.
    Du musst auf jeden Fall mal ein bisschen JS lernen und dir an den verschiedenen Stellen im Code die Daten vergleichen, dann kannst du den Fehler eingrenzen.
    mysql ist veraltet Mails senden: Ohne Probleme und ohne mail()
    PHP-Code:
    echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>'

    Kommentar


    • #3
      Es geht eigentlich nur um die Funktion RSA.encrypt(). Die Frage bezieht sich mehr auf RSA Verschlüsselung.

      Kommentar


      • #4
        nochmal kurz erklärt:

        man holz sich aus einer Datei den publickey_mod und publickey_exp und erstellt daraus einen PublicKey mit dem dann das Passwort verschlüsselt wird.

        Das mach ich ja soweit auch schon, aber es geht bloß nicht. Deswegen wollte ich hier Fragen ob ich vielleicht noch was vergessen habe.

        Kommentar


        • #5
          Ich habe zwar noch nie mit der RSA-Bibliothek in PHP gearbeitet, was mir aber auffällt ist, dass du ihr als Schlüssel Objekte vom Typ BigInteger übergibst, was auf den ersten Blick nichts mit der RSA-Klasse zu tun hat.
          Kann es sein, dass da ein Fehler auftaucht?

          PS: Hast du mal geprüft, ob die Datei mit den Keys in PHP überhaupt ankommt? Der UserAgent ist auf jeden Fall mehr als merkwürdig, als konnte sich jemand nicht entscheiden, um welchen Browser es sich handelt.
          mysql ist veraltet Mails senden: Ohne Probleme und ohne mail()
          PHP-Code:
          echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>'

          Kommentar


          • #6
            Die Datei kommt an und die Verschlüsselung klappt auch ohne Probleme. Die Klasse BigInteger braucht man wenn man mit Verschlüsselungen arbeitet, da man mit dieser mit sehr sehr großen Zahlen rechnen kann.

            Mein Problem ist nicht dass es nicht funktioniert, sondern, dass was anderes rauskommt als wenn der Javascript Code das Passwort verschlüsselt.

            Der Javascript Code ist ja nicht von mir ich möchte nur einen Login auf die Seite Steampowered.com machen, bei dem die Sessions übergeben werden, aber ich muss dazu dieses Passwort verschlüsseln.

            Der UserAgent ist egal, es wird einfach nur geprüft ob was enthalten ist.

            Kommentar


            • #7
              $buffer[--$keysize]

              Was bedeutet das -- und gibt es das auch in PHP?
              Das ist zum Beispiel eine meiner Verständnisfragen zu den Javascript Code

              Kommentar


              • #8
                ja gibt es, das ist ein array access mit einem pre-decreased key ( vor dem nutzen des wertes um 1 reduzierter wert der variable ).
                [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                Kommentar

                Lädt...
                X