Συνάρτηση .net αντιστοιχία σε php

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Συνάρτηση .net αντιστοιχία σε php

Δημοσίευση από alou » 14 Ιουν 2013 15:28

Καλησπέρα.

Προσπαθώ να φτιάξω ένα hash γνωρίζοντας τον αντίστοιχο τρόπο / συνάρτηση που φτιάχνεται σε .net αλλά δεν έχω βγάλει σωστό αποτέλεσμα οπότε αν κάποιος κατανοεί και τις 2 γλώσσες ίσως μπορεί να βοηθήσει. Tα περιεχόμενα της συνάρτησης:

Κώδικας: Επιλογή όλων

Dim data(0 To 30 - 1) As Byte
Dim result(0 To 30 - 1) As Byte
Dim encoding As New System.Text.ASCIIEncoding()

For i As Integer = 0 To pass.Length - 1
       data(i) = Convert.ToByte(pass(i))
Next

Dim SHA As SHA512 = New SHA512Managed()
result = SHA.ComputeHash(data)
Dim kodikos As String = Convert.ToBase64String(result, 0, result.Length)
Return kodikos

Έχω δοκιμάσει διάφορους τρόπους μετατροπής του $password πριν γίνει sha512 και base64 encoded, αλλά προφανώς κάτι δεν κάνω σωστά:

Οπότε, λέω γω τώρα:

Κώδικας: Επιλογή όλων

$password = 'enaPassword'; //i metavliti ***pass*** antistoixa sto allo fn

$passwordArr = str_split($password);
//μια περιπτωση με hex και μια με κανονικά byte values 
$pwdAsByte ;
$pwdAsHByte ;
foreach ($passwordArr as $pwdpart) {
  $pwdAsByte .= ord($pwdpart);
  $pwdAsHByte .= dechex(ord($pwdpart));
}

//sha 512 encode + base64
$aplo = base64_encode(hash('sha512', $password));
$hashedBytes = base64_encode(hash('sha512', $pwdAsByte));
$hexbytes = base64_encode(hash('sha512', $pwdAsHByte));


Κανένα από τα παραπάνω ($aplo, $hashedBytes, $hexbytes) δεν δίνει την αντίστοιχη τιμή με το kodikos... καμμία ιδέα?
Προφανώς υπάρχουν κομμάτια στη .net συνάρτηση που δεν καταλαβαίνω και δεν τα λαμβάνω σωστά υπόψιν...

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

Συνάρτηση .net αντιστοιχία σε php

Δημοσίευση από nbc » 14 Ιουν 2013 16:30

Για δοκίμασε και αυτό:

Κώδικας: Επιλογή όλων

$kodikos = base64_encode(hash('sha512', $password, TRUE));
--------

Στο PHP port βλέπω 2 λογικά λάθη:

1) Η εντολή $pwdAsByte .= ord($pwdpart); δεν έχει το αποτέλεσμα που περιμένεις, και σίγουρα δεν είναι αντίστοιχη με την data(i) = Convert.ToByte(pass(i)).

2) Η SHA.ComputeHash(data) επιστρέφει byte array, το οποίο σημαίνει πως στην αντίστοιχη hash() θέλουμε το 3ο όρισμα ($raw_output) TRUE.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Συνάρτηση .net αντιστοιχία σε php

Δημοσίευση από alou » 14 Ιουν 2013 17:13

nbc έγραψε:Για δοκίμασε και αυτό:

Κώδικας: Επιλογή όλων

$kodikos = base64_encode(hash('sha512', $password, TRUE));
--------

Στο PHP port βλέπω 2 λογικά λάθη:

1) Η εντολή $pwdAsByte .= ord($pwdpart); δεν έχει το αποτέλεσμα που περιμένεις, και σίγουρα δεν είναι αντίστοιχη με την data(i) = Convert.ToByte(pass(i)).

2) Η SHA.ComputeHash(data) επιστρέφει byte array, το οποίο σημαίνει πως στην αντίστοιχη hash() θέλουμε το 3ο όρισμα ($raw_output) TRUE.
Thanks για τη βοήθεια :D , το θέμα με το data(i) = Convert.ToByte(pass(i)) είναι αυτό ακριβώς, δεν ξέρω τι πρέπει να περιμένω.

Για το true (raw data) σαν τρίτη παράμετρο στο hash έχεις δίκιο, το έχω συμπεριλάβει χρησιμοποιόντας όλες τις παραπάνω 'εκδόσεις' του password, χωρίς να έχω σωστό αποτέλεσμα.

Βλέπω στο http://msdn.microsoft.com/en-us/library ... obyte.aspx
ToByte(Char) Converts the value of the specified Unicode character to the equivalent 8-bit unsigned integer.
Το pass περνιέται σαν παράμετρος στο .net function, με αυτό τον τρόπο:

Public Shared Function Ταδε (ByVal pass As String, _
ByVal PaisWeb As Integer) As String...

Το pass(i) είναι χαρακτήρας του pass που είναι string, ας πούμε "a" άρα δεν σημαίνει ότι παίρνω την ίδια τιμή με το
orb("a") ?

Μάλλον εκεί δημιουργείται η διαφορά αλλά δεν καταλαβαίνω το λόγο... και δεν έχω καμμία επαφή με .net

edit:
μάλλον πρέπει να παίξω με το unpack(format, string) αλλά το προφανές φορμάτ I (unsigned integer που λέει ότι χρησιμοποιεί και το ToByte) δεν είναι σωστό...

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

Συνάρτηση .net αντιστοιχία σε php

Δημοσίευση από nbc » 14 Ιουν 2013 19:05

Το char στο NET είναι 16 bits, στην PHP 8 bits. Συνεπώς, το NET-pass(i) δεν είναι ίδιο με το PHP-ord(pass(i)). Πέραν αυτού, δεν μπορώ να φανταστώ context στο οποίο το concatenation των ord() έχει κάποια λογική. Για να καταλάβεις τι παθαίνει το string, αρκεί να το τυπώσεις... Θα πάρεις μία έξοδο του στυλ 1001019997102, που δεν είναι η ζητούμενη.

Τέλος, στην PHP, το string είναι ήδη byte array και δεν χρειάζεται περαιτέρω επεξεργασία.

Τώρα, το γιατί δεν σου δουλεύει μπορώ να σκεφτώ 2 πράγματα:

1) Δοκίμασε με passwords στα λατινικά, ψηφία, κλπ, δηλαδή ASCII. Δεν είμαι σίγουρος με ποια λογική γίνεται το mapping σε 8 bit, αλλά φαντάζομαι πως θα χρησιμοποιείται το τρέχον character encoding, πχ Windows-1253. Θα πρέπει και στην PHP να τρέχει το ίδιο encoding για να υπάρχει συμβατότητα.

2) Υπάρχει κάτι στον κώδικα που παρέθεσες, το οποίο δε μου κάθετε καλά:
Dim result(0 To 30 - 1) As Byte
Δεν ασχολούμαι με NET αλλά αν αυτό δημιουργεί array 30 bytes, αναρωτιέμαι πως χωράει την έξοδο του SHA.ComputeHash(data) ή οποία - μιας και μιλάμε και sha512 - είναι 64 bytes!

Πέραν αυτών, άλλο δεν ξέρω :D

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Συνάρτηση .net αντιστοιχία σε php

Δημοσίευση από alou » 14 Ιουν 2013 21:28

thanks και πάλι nbc, δε βγάζω άκρη σήμερα, με καθαρό μυαλό από αύριο ελπίζω...

Επειδή και γω δεν ασχολούμαι με vb.net που τελικά είναι αυτό προσπαθώ με δοκιμές να καταλάβω...
(το (2) που αναφέρεις το προσπερνάω με αισιοδοξία :) )

Έχω δοκιμάσει ότι μπορούσα να φανταστώ, στο βαθμό που μπορώ να καταλάβω τι προσπαθώ να συγκρίνω:
ToByte(Char) Converts the value of the specified Unicode character to the equivalent 8-bit unsigned integer.

Πήρα σβάρνα και δοκίμασα ότι μου ερχόταν σαν πιθανή λύση ακόμα και κάποια σίγουρα λάθος, τα βάζω εδώ μπας και έρθει καμιά ιδέα (προφανώς δεν είναι σωστό τίποτα από αυτά) :

Κώδικας: Επιλογή όλων

$kodikosunpack = base64_encode(hash('sha512', $password, TRUE));
		/////\\\\\2
		$passwordArr = json_encode(str_split($password));
		echo $passwordArr."<br />";
		$arraypass = base64_encode&#40;hash&#40;'sha512', $passwordArr, TRUE&#41;&#41;;
		/////\\\\\3
		$otherWay = '';
		foreach &#40;str_split&#40;$password&#41; as $pwdparts&#41; &#123;
			$bin = decbin&#40;ord&#40;$char&#41;&#41;;
			$otherWay .= str_pad&#40;$bin, 8, 0, STR_PAD_LEFT&#41;;
		&#125;
		$otherkodikos = base64_encode&#40;hash&#40;'sha512', $otherWay, TRUE&#41;&#41;;
		/////\\\\\4
		$otherWayArr = array&#40;&#41;;
		foreach &#40;str_split&#40;$password&#41; as $pwdparts&#41; &#123;
			$otherWayArr&#91;&#93; = decbin&#40;ord&#40;$char&#41;&#41;;
			//$otherWayArr&#91;&#93; = str_pad&#40;$bin, 8, 0, STR_PAD_LEFT&#41;;
		&#125;
		$passwordArr2 = json_encode&#40;$otherWayArr&#41;;
		$otherkodikos2 = base64_encode&#40;hash&#40;'sha512', $passwordArr2, TRUE&#41;&#41;;
		/////\\\\\5
		function BinString2BitSequence&#40;$mystring&#41; &#123;   
			$mybitseq = "";
			$end = strlen&#40;$mystring&#41;;
			for&#40;$i = 0 ; $i < $end; $i++&#41;&#123;
				$mybyte = decbin&#40;ord&#40;$mystring&#91;$i&#93;&#41;&#41;; // convert char to bit string
				$mybitseq .= substr&#40;"0000000000000000",0,16 - strlen&#40;$mybyte&#41;&#41; . $mybyte; // 8 bit packed
			&#125;
			return $mybitseq;
		&#125;
		
		$noFive = BinString2BitSequence&#40;$password&#41;;
		$otherkodikos3 = base64_encode&#40;hash&#40;'sha512', $noFive, TRUE&#41;&#41;;
		echo $noFive."<br />";
		/////\\\\\ 6
		$pwdpacked = unpack&#40;"I", $password&#41;;
		$pwdpacked2 = pack&#40;"I", $password&#41;;
		$otherkodikos4 = base64_encode&#40;hash&#40;'sha512', json_encode&#40;$pwdpacked&#41;, TRUE&#41;&#41;;
		$otherkodikos5 = base64_encode&#40;hash&#40;'sha512', json_encode&#40;$pwdpacked2&#41;, TRUE&#41;&#41;;
		
		$repack ;
		foreach &#40;$pwdpacked as $rep&#41; &#123;
			$repack .= $rep;
		&#125;
		
		$otherkodikos6 = base64_encode&#40;hash&#40;'sha512', $repack, TRUE&#41;&#41;;
		$otherkodikos7 = base64_encode&#40;hash&#40;'sha512', $pwdpacked2, TRUE&#41;&#41;;
Τελευταία επεξεργασία από το μέλος alou την 14 Ιουν 2013 21:32, έχει επεξεργασθεί 1 φορά συνολικά.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Συνάρτηση .net αντιστοιχία σε php

Δημοσίευση από alou » 14 Ιουν 2013 21:31

double post, sorry

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

Συνάρτηση .net αντιστοιχία σε php

Δημοσίευση από nbc » 14 Ιουν 2013 23:38

Εντάξει, το πέθανες :D Δεν χρειάζονται όλα αυτά...

Η γραμμή που σου έδωσα στο 1ο ποστ εμπεριέχει όλη τη λογική της NET function, μείον τη λεπτομέρεια που μου διαφεύγει λόγω άγνοιας Visual Basic και λανθασμένου (κατά τη γνώμη μου) κώδικα.

Δοκίμασε και την ακόλουθη παραλλαγή, για να μου φύγει η υποψία 2) σχετικά με το μέγεθος του array:

Κώδικας: Επιλογή όλων

$kodikos = base64_encode&#40;substr&#40;hash&#40;'sha512', $password, TRUE&#41;,0,30&#41;&#41;; 
Αν δεν παίξει ούτε και αυτό, τότε δώσε μου 1 input/output της NET (πχ, τι επιστρέφει για password='1'), και θα βρω τι φταίει.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Συνάρτηση .net αντιστοιχία σε php

Δημοσίευση από alou » 15 Ιουν 2013 00:17

Έχω output για ένα κανονικό pass μόνο οπότε στο έστειλα, θενκς και πάλι :D

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

Συνάρτηση .net αντιστοιχία σε php

Δημοσίευση από nbc » 15 Ιουν 2013 10:47

$kodikos = base64_encode(hash('sha512', str_pad($password,30,"\x00"), TRUE));


ΥΓ: Μου είχε διαφύγει το γεγονός ότι το hashing γινόταν επί του συνολικού data, δηλωθέν ως array 30 bytes. Υποθέτοντας (και ελπίζοντας) πως η VB κάνει initialize με 0, κάνουμε το αντίστοιχο padding στο password και βουαλά το port λειτουργεί δια της μαύρης μαγείας.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Συνάρτηση .net αντιστοιχία σε php

Δημοσίευση από alou » 15 Ιουν 2013 16:05

:respect:

Μπράβο ρε nbc... και ευχαριστώ πολύ :D

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες