8768 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je suis entrain de traduire un site qui a été développé en ASP vers PHP. Une base de données existe déjà avec l'ancien site. Dans la base j'ai une table client avec des mots de passe encryptés avec une fonction ASP. J'aimerais utiliser ces mots de passe sur le nouveau site en PHP. Dois-je modifier tous les mots de passe clients pour les utiliser sur le nouveau site php ? Existe-t-il un moyen de changer la clé de cryptage actuelle ASP pour PHP ? Ou tout autre moyen sans devoir modifier tous les mots de passe clients ? Est-ce que quelqu'un a déjà rencontré ce genre de problème ? Toute aide est la bienvenue.

Merci par avance !
Il faudrait connaître la manière dont c'est crypté. Logiquement, si c'est bien fait, ce n'est pas réversible donc il faudrait soit :

- appliquer le même cryptage si il est possible d'avoir une correspondance entre la fonction asp en php.
- inviter les utilisateurs a ressaisir de nouveau mot de passe et validant l'opération via un mail ou éventuellement les recréer à la main si la tâche n'est pas trop laborieuse ou gênante vis à vis des clients.
salut,
en temps normal, on devrait parler de hashage et non de cryptage. Avec quelle fonction ASP cela est fait ?
Si c'est haché ou chiffré avec un algorithme standard, tu ne devrais pas avoir de problème normalement.


Par algorithme standard, j'entends notamment sha1/256/384/512 pour du hashage, et AES pour le chiffrage.

Attention si c'est du chiffrage AES, préférer les fonctions d'openSSL plutôt que le module de crypto de PHP. J'ai eu des problèmes pour récupérer des données provenant de Node.js car le module de crypto de PHP n'utilise pas le AES standard mais une variante Richdael.
Bonjour à tous,

Merci d'avoir pris le temps de me répondre et pour les explications.
Vous trouverez ci-dessous les fonctions qui permettent d'encrypter les mots de passe :


sPlain = "0000000000000000"
	
g_CryptThis = sPlain
Const g_KeyLocation = "/code.txt"
Dim g_Key
g_Key = mid(ReadKeyFromFile(g_KeyLocation),1,Len(g_CryptThis))

Function ReadKeyFromFile(strFileName)
	   Dim keyFile, fso, f
	   set fso = Server.CreateObject("Scripting.FileSystemObject") 
	   set f = fso.GetFile(strFileName) 
	   set ts = f.OpenAsTextStream(1, -2)
	   Do While not ts.AtEndOfStream
		 keyFile = keyFile & ts.ReadLine
	   Loop 
	   ReadKeyFromFile = keyFile
End Function

sPassword = g_Key

MyEncrypt(sPlain, sPassword)

Public Function MyEncrypt(sPlain, sPassword)
	Dim bytIn()
	Dim bytPassword()
	Dim lLength
	Dim lCount
	Dim sTemp
	    
	lLength = Len(sPlain)
    ReDim bytIn(lLength-1)
    For lCount = 1 To lLength
        bytIn(lCount-1)=CByte(AscB(Mid(sPlain,lCount,1)))
    Next

    lLength = Len(sPassword)
    ReDim bytPassword(lLength-1)
    For lCount = 1 To lLength
        bytPassword(lCount-1)=CByte(AscB(Mid(sPassword,lCount,1)))
    Next
	
    bytOut = EncryptData(bytIn, bytPassword)
    
    sTemp = ""
    For lCount = 0 To UBound(bytOut)
        sTemp = sTemp & Right("0" & Hex(bytOut(lCount)), 2)
    Next
    MyEncrypt = sTemp
End Function


// fichier code.txt

AZÂEsdfkgflfgd++*+@fmgkgfdg54_-$^tyh*ùg1g56g4dfggdf+


Cordialement,
Modifié par dinolam (08 Aug 2016 - 10:33)
JE ne connais pas du tout ASP mais à vue de nez ça a l'air réversible. Ca ressemble à un algorithme de chiffrage maison. Doublement pas très malin pour stocker des mots de passe, mais ça va faire nos affaires ici.


Car si effectivement l'opération est réversible, ce qui est de loin le plus simple est de fairre un script ASP qui déchiffre tous les mots de passe et qui les stocke en clair temporairement quelque part, puis un script PHP qui les relit et les rechiffre (et bien sûr qui supprime les mots de passe en clair dès que l'opération est terminée). C'est bien moins risqué que de compter sur une compatibilité entre les deux langages.


P.S. Tu ferais mieux d'effacer une partie de la clé figurant dans ton message, elle n'est visiblement pas elle-même chiffrée. On ne sait jamais.
Comme déjà expliqué, c'est très risqué, d'une part d'avoir ses propres fonctions de cryptage (ou chiffrage pour parler en bon français) et surtout de les utiliser pour des mots de passe.

PHP fournit à partir de sa version 5.5 des fonctions natives de hachage. Tu utiliseras principalement password_hash et password_verify pour contrôler tes mots de passe.
Si tu travailles avec une version antérieure (tu devrais changer d'hébergeur Smiley langue ) ou plus raisonnablement passer par une librairie qui te permet une compatibilité.

Si tu tiens quand même à avoir des fonctions pour chiffrer tes données qui pourrait toujours s'avérer utiles, je te conseillerais vivement de passer par des libraires crées par des pros car le chiffrage de données n'est pas une affaire si simple et même avec les fonctions natives de PHP, tu arriveras forcément à un moment où tu t'arracheras les cheveux si tu ne maîtrises pas les notions de bases.
En voici donc deux des plus fiables qui existent : defuse et libsodium.
La première est plus facile à utiliser.
Re,

Merci encore pour vos réponses !
La solution avec les librairies me semble très compliquée et je ne suis pas sûr d'aboutir au résultat final. Est-ce que vous pensez qu'il y a un autre moyen à partir de mon site php après un log de faire transiter par une page ASP pour crypter les mots de passe ?

Cdlt,
Je pense qu'il y a un malentendu.
Il te faut vraiment éviter de crypter (ou chiffrer) tes mots de passes et surtout avec tes propres fonctions. Il faut à tout prix procéder à un hachage.

La première chose que tu devrais faire et de simplement créer un script PHP qui déchiffrerait l'ensemble des mots de passes dans ta BDD en utilisant le même principe que ta fonction en ASP. Sans les restocker en clair, tu les haches directement dans le script et tu les enregistres au fur et à mesure.
Comme spécifié dans mon message précédent, PHP inclut des fonctions natives de hachage, donc pas besoin de librairies (la librairie proposée est pour une rétrocompatibilité relative aux versions antérieures à 5.5).

Cependant, tu devrais laisser cette étape en dernier (une fois ta migration finie) car une fois tes mots de passes hachés, il seront forcément inaccessibles à tes anciens scripts.

Les librairies de chiffrement sont un plus. Je les ai ajouté en lien pour les avoir sous la main le jour où tu en auras besoin.
Je me répète peut être mais le chiffrement de données n'est pas une simple affaire et tu dois en connaître les principes au risque d'aboutir à des erreurs de déchiffrement récurrentes.

Les fonctions natives en PHP sont soit obsolètes soit mal documentées (en ce qui concerne openssl)

Et une dernière chose, ne laisse jamais tes clés de chiffrement sur un forum !
a écrit :
La solution avec les librairies me semble très compliquée et je ne suis pas sûr d'aboutir au résultat final. Est-ce que vous pensez qu'il y a un autre moyen à partir de mon site php après un log de faire transiter par une page ASP pour crypter les mots de passe ?


Ca ne sera pas plus simple à mon avis. Soit tu fais une vraie transition de ASP vers PHP et à terme tu abandonnes définitivement ASP, ou soit tu fais un mix mais tu as des chances que des vieux problèmes à la con resurgissent sans crier gare. C'est souvent comme ça quand on mélange deux langages et écosystèmes différents.


Fais vraiment en sorte d'abandonner définitivement tes fonctions de chiffrage perso. Non seulement mieux vaut hasher que chiffrer les mots de passe, mais en plus oublie les fonctions perso pour passer aux standards. Il en va de ta sécurité et celle de tes utilisateurs !


Petite analogie idiote: c'est intéressant de mettre les doigts dans la prise pour comprendre comment ça fonctionne, mais on le fait à quelque part où on sait qu'on ne court aucun risque grave; certainement pas sur le réseau électrique réel!


Est-ce que tu fais du PHP pur, ou est-ce que tu utilises un framework comme Symfony ? Parce que si tu utilises un framework, il y a de bonnes chances pour que les bibliothèques soient incluses et que tu n'aies pas vraiment à t'en soucier en fait.
Bonjour,

Pour répondre à @QuentinC, j'utilise du PHP pur sans framework. Et pour @Zelalsan, la clé de chiffrement que j'ai mis n'est pas la bonne c'est juste pour illustrer un exemple.

Pour ce qui est du hachage des mots de passe j’attends d'abord que mon site soit fonctionnel pour le faire. Mais j'utilise actuellement la base de données pour faire mes tests sur le site PHP. Le problème je suis bloqué car je ne pas faire de test avec les mots de passe hachés en ASP.

Ce que j'aimerais faire c'est de déchiffrer les mots de passe dans la base de données pour que je puisse m'en servir pour le test en PHP. Je ne sais pas comment procéder pour le déchiffrement.

Cdlt,
Tes mots de passes ne sont pour l'instant pas hachés mais simplement chiffrés avec ta fonction ASP.
Tu devrais, comme déjà suggéré, retranscrire ta fonction ASP en PHP.

Je n'ai pas compris ce que tu fais vraiment avec le bout de code que tu as partagé mais ça pourrait donner un truc du genre (en essayant de ne pas changer tes variables même si ça pourrait être simplifié):

<?php

	function MyEncrypt($sPlain, $sPassword) {

		foreach(str_split($sPlain) as $v)
			$bytIn[] = ord($v);

		foreach(str_split($sPassword) as $v)
			$bytPassword[] = ord($v);

		$sTemp = '';
		foreach(EncryptData($bytIn, $bytPassword) as $v)
			$sTemp .= substr('0'.dechex($v), -2);

	}
	
	define('G_KEYLOCATION', '/code.txt');

	$sPlain = "0000000000000000";

	$g_CryptThis = $sPlain;
	$g_Key = file_get_contents(G_KEYLOCATION);

	$sPassword = $g_Key;


Cependant, on ignore ce que contient ta fonction EncryptData. Il faudrait donc la convertir aussi en PHP pour que ça marche.
Plus simple que d'essayer de transcrire des fonctions de ASP vers PHP, je propose (à nouveau) ceci:
1 - Tu fais un script ASP qui déchiffre les mots de passe un par un et qui stocke les mots de passe déchiffrés en clair quelque part (fichier temporaire, nouvelle colonne dans la table, ce que tu veux, peu importe)
2 - Tu fais un script PHP qui lit les mots de passe en clair, qui les hache et qui les stocke dans ta base de donnée

La fonction de déchiffrage en ASP, en fait, tu dois déjà l'avoir. Quand les utilisateurs se connectent, ou quand ils ont perdu leur mot de passe, à un moment tu dois bien déchiffrer les mots de passe chiffrés en base non ?

Si tu ne l'as pas, il va falloir prendre la fonction de chiffrage à rebours, mais ce sera probablement plus simple de le faire en ASP qu'en PHP (du moins ça t'éviteras de réfléchir aux particularismes des deux langages et d'introduire des bugs à la con parce qu'ils ont un comportement peut-être légèrement différent; bugs dont tu ne t'apercevras peut-être même pas vu que tu pourrais très bien tomber sur des données apparament valides mais fausses)
Modifié par QuentinC (11 Aug 2016 - 23:56)