OVH Cloud OVH Cloud

Crypter une string

2 réponses
Avatar
Julien
Bonjour à tous,
j'aimerais enregistrer un mot de passe dans la base de registre, mais de
façon crypté.
Je n'ai pas trouver de méthode simple pour cypter/décrypter une string (le
résultat doit être une string aussi si possible...)

avez vous une idée ?

Merci beaucoup, Julien

2 réponses

Avatar
Patrick Philippot
Julien wrote:
j'aimerais enregistrer un mot de passe dans la base de registre, mais
de façon crypté.
Je n'ai pas trouver de méthode simple pour cypter/décrypter une
string (le résultat doit être une string aussi si possible...)



Bonjour,

S'il s'agit juste de masquer les données sans qu'un niveau de protection
très élevé soit requis, un simple algorithme minimum basé sur un XOR
(éventuellement multiple) peut faire l'affaire.

Sinon, utilisez les classes du namespace System. Security.Cryptography.
Une des techniques les plus simples est de procéder comme suit:

1. Quand l'utilisateur définit un mot de passe, on ne stocke pas le mot
de passe mais le hash code correspondant (créé comme décrit ici:
http://www.a1vbcode.com/vbtip.asp?ID9).

2. On stocke le hash code.

3. Quand l'utilisateur doit à nouveau entrer le mot de passe, on
récupère la chaîne entrée et on calcule à nouveau le hash code qui doit
être identique au hash code stocké (dans la registry).

C'est le meilleur moyen de protéger un mot de passe car le hashing ne
fonctionne que dans un sens. On ne peut pas recréer le mot de passe à
partir du hashcode. C'est comme cela que Windows authentifie les logons.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Julien
J'ai résolu mon pb en utilisant cette classe :

Imports System
Imports System.IO
Imports System.Text
Imports System.Security
Imports System.Security.Cryptography

Public Class EncryptData
Public Shared mbytKey(7) As Byte
Public Shared mbytIV(7) As Byte

' -----------------------------------------------------
Public Shared Function InitKey(ByVal strKey As String) As Boolean
'Fonction de génération des clés pour les variables internes
Try
' Conversion de la clé en Tableau d'Octets
Dim bp(strKey.Length - 1) As Byte
Dim aEnc As ASCIIEncoding = New ASCIIEncoding()
aEnc.GetBytes(strKey, 0, strKey.Length, bp, 0)

'Hashage de la clé en utilisant SHA1
Dim sha As SHA1CryptoServiceProvider = New
SHA1CryptoServiceProvider()
Dim bpHash() As Byte = sha.ComputeHash(bp)

Dim i As Integer
' Utilisation de la base 64-bits pour la valeur de la Clé
For i = 0 To 7
mbytKey(i) = bpHash(i)
Next i

For i = 8 To 15
mbytIV(i - 8) = bpHash(i)
Next
Return True

Catch e As Exception
'Erreur durant les opérations
Return False
End Try
End Function

' -----------------------------------------------------
Public Shared Function EncryptData(ByVal strKey As String, ByVal strData
As String) As String
Dim strResult As String

'1. La chaine de doit pas dépasser 90 Ko, sinon le Buffer sera
dépassé.
'Voir la raison au point 3
If strData.Length > 92160 Then
strResult = "Erreur: Les données sont trop volumineuses. Ne pas
dépasser 90Ko."
Return strResult
End If

'2. Génération de la Clé
If Not (InitKey(strKey)) Then
strResult = "Erreur: Impossible de générer la clé de Cryptage."
Return strResult
End If

'3. Préparation de la Chaine
' Les premiers 5 caractères de la Chaine sont formatés pour stocker
l'actuelle
' longueur des Données. C'est une méthode simple pour conserver la
taille originale
' des données, sans avoir à compliquer les calculs.
strData = String.Format("{0,5:00000}" & strData, strData.Length)


'4. Cryptage des Données
Dim rbData(strData.Length - 1) As Byte
Dim aEnc As New ASCIIEncoding()
aEnc.GetBytes(strData, 0, strData.Length, rbData, 0)

Dim descsp As DESCryptoServiceProvider = New
DESCryptoServiceProvider()

Dim desEncrypt As ICryptoTransform = descsp.CreateEncryptor(mbytKey,
mbytIV)


'5. Préparation des streams:
' mOut est le Stream de Sortie.
' mStream est le Stream d'Entrée.
' cs est la Stream de Transformation.
Dim mStream As New MemoryStream(rbData)
Dim cs As New CryptoStream(mStream, desEncrypt,
CryptoStreamMode.Read)
Dim mOut As New MemoryStream()

'6. Début du Cryptage
Dim bytesRead As Integer
Dim output(1023) As Byte
Do
bytesRead = cs.Read(output, 0, 1024)
If Not (bytesRead = 0) Then
mOut.Write(output, 0, bytesRead)
End If
Loop While (bytesRead > 0)

'7. Renvoie le résultat Crypté encodé en Base 64
' Dans ce cas, Le résultat Actuel est Converti en Base 64 et il peut
être
' transporté au travers du protocole HTTP sans déformation.
If mOut.Length = 0 Then
strResult = ""
Else
strResult = Convert.ToBase64String(mOut.GetBuffer(), 0,
CInt(mOut.Length))
'8. Modification de la chaine d'entrée pour récupérer les +
' qui ne sont pas passables via Querystring
strResult = strResult.Replace("+", "-||-||-")
End If
Return strResult

End Function

' -----------------------------------------------------
Public Shared Function DecryptData(ByVal strKey As String, ByVal strData
As String) As String

Dim strResult As String

'1. Modification de la chaine d'entrée pour récupérer les +
' qui ne sont pas passables via Querystring
strData = strData.Replace("-||-||-", "+")

'2. Génération de la Clé
If Not (InitKey(strKey)) Then
strResult = "Erreur: Impossible de générer la clé de Cryptage."
Return strResult
End If

'2. Initialisation du Provider
Dim nReturn As Integer = 0
Dim descsp As New DESCryptoServiceProvider()
Dim desDecrypt As ICryptoTransform = descsp.CreateDecryptor(mbytKey,
mbytIV)

'3. Préparation des streams:
' mOut est le Stream de Sortie.
' cs est la Stream de Transformation.
Dim mOut As New MemoryStream()
Dim cs As New CryptoStream(mOut, desDecrypt, CryptoStreamMode.Write)

'4. Mémorisation pour revenir de la Base 64 vers un tableau d'Octets
pour récupérer le
'le Stream de base Crypté
Dim bPlain(strData.Length - 1) As Byte
Try
bPlain = Convert.FromBase64CharArray(strData.ToCharArray(), 0,
strData.Length)
Catch e As Exception
strResult = "Erreur: Les données en Entrée ne sont pas en base
64."
Return strResult
End Try

Dim lRead As Long = 0
Dim lReadNow As Long = 0
Dim lTotal As Long = strData.Length

Try
'5. Réalise le Décryptage
Do While (lTotal >= lRead)
cs.Write(bPlain, 0, bPlain.Length)
lReadNow = CLng(((bPlain.Length / descsp.BlockSize) *
descsp.BlockSize))
lRead = lReadNow + lRead
Loop

Dim aEnc As New ASCIIEncoding()
strResult = aEnc.GetString(mOut.GetBuffer(), 0,
CInt(mOut.Length))

'6. Nettoie la chaine pour ne renvoyer que les données
signicatives
' Rappelez-vous cela dans la fonction de chiffrage, les 5
premiers caractères
' permettent de conserver la taille originale de la chaine de
caracteres
' C'est la méthode la plus simple de mémoriser la taille des
données d'origine,
' sans passer par des calculs complexes.

Dim strLen As String = strResult.Substring(0, 5)
Dim nLen As Integer = CInt(strLen)
strResult = strResult.Substring(5, nLen)
nReturn = CInt(mOut.Length)

Return strResult
Catch e As Exception
strResult = "Erreur: Impossible de décrypter. Eventuellement "
strResult &= "à cause d'une clé non conforme ou de données
corrompue."
End Try
Return strResult
End Function

' -----------------------------------------------------
End Class




"Julien" a écrit dans le message de
news:cqudsk$2djn$
Bonjour à tous,
j'aimerais enregistrer un mot de passe dans la base de registre, mais de
façon crypté.
Je n'ai pas trouver de méthode simple pour cypter/décrypter une string (le
résultat doit être une string aussi si possible...)

avez vous une idée ?

Merci beaucoup, Julien