Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Encyption-Decryption functions

Îåêßíçóå áðü ôï ìÝëïò Ioannis P. Τελευταία δημοσίευση από το μέλος cap στις 01-04-2006, 19:29. Υπάρχουν 12 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  22-03-2006, 12:07 10961

    Encyption-Decryption functions

    Θέλω να αποθηκεύω τα δεδομένα σε μια βάση κωδικοποιημένα και όταν τα διαβάζω να τα αποκωδικοποιώ. Βρήκα δυο functions που κάνουν encryption/decryption και θα ήθελα να τις ρίξετε μια ματιά πριν τις χρησιμοποιήσω. Βασικά θέλω να μου πείτε αν είναι σωστός ο τρόπος που γίνεται η κωδικοποίηση (λειτουργούν και οι δύο κανονικά) και τι θα πρέπει να κάνω με το hash.

    Ευχαριστώ προκαταβολικά.

    Imports System
    Imports System.Security
    Imports System.Security.Cryptography

    Public genKey As String = "d%HF#gkdjh#89$*GJ#%%@WF!@F:Lqe:?"
    Public genIV As String = "jkh$%#JLD{FSo*d|"

        Public Function Getkey() As Byte()

            Getkey = System.Text.Encoding.Default.GetBytes(genKey)
        End Function


        Public Function Encrypt(ByVal vText As String) As String
            Dim msin As New System.IO.MemoryStream()
            msin.Write(System.Text.Encoding.Default.GetBytes(vText), 0, System.Text.Encoding.Default.GetBytes(vText).Length)
            msin.Position = 0

            Dim msout As New System.IO.MemoryStream()
            Dim buf() As Byte = New Byte(2048) {}
            Dim sa As SymmetricAlgorithm = SymmetricAlgorithm.Create("Rijndael")
            sa.IV = System.Text.Encoding.Default.GetBytes(genIV)
            sa.Key = Getkey()

            Dim trans As ICryptoTransform = sa.CreateEncryptor()
            Dim cs As CryptoStream = New CryptoStream(msout, trans, CryptoStreamMode.Write)
            Dim nLen As Integer

            nLen = msin.Read(buf, 0, buf.Length)
            While (nLen > 0)
                cs.Write(buf, 0, nLen)
                nLen = msin.Read(buf, 0, buf.Length)
            End While
            cs.FlushFinalBlock()

            Encrypt = System.Convert.ToBase64String(msout.ToArray)

            cs.Close()
            msin.Close()

        End Function

        Public Function Decrypt(ByVal vText As String) As String
            Dim msin As New System.IO.MemoryStream()
            msin.Write(Convert.FromBase64String(vText), 0, Convert.FromBase64String(vText).Length)
            msin.Position = 0

            Dim msout As New System.IO.MemoryStream()
            Dim buf() As Byte = New Byte(2048) {}
            Dim sa As SymmetricAlgorithm = SymmetricAlgorithm.Create("Rijndael")
            sa.IV = System.Text.Encoding.Default.GetBytes(genIV)
            sa.Key = Getkey()

            Dim trans As ICryptoTransform = sa.CreateDecryptor()
            Dim cs As CryptoStream = New CryptoStream(msin, trans, CryptoStreamMode.Read)
            Dim nLen As Integer

            nLen = cs.Read(buf, 0, buf.Length)
            While (nLen > 0)
                msout.Write(buf, 0, nLen)
                nLen = cs.Read(buf, 0, buf.Length)
            End While

            Decrypt = System.Text.Encoding.Default.GetString(msout.ToArray)

            msin.Close()
            msout.Close()

        End Function

  •  22-03-2006, 12:45 10963 σε απάντηση της 10961

    Απ: Encyption-Decryption functions

    Οπότε αν ανοίξει κάποιος το dll ή το exe σου με έναν decompiler, μπορεί να διαβάσει τα κλειδιά που χρησιμοποιείς, και αν αποκτήσει πρόσβαση στη βάση θα μπορέσει να αποκρυπτογραφήσει όλα σου τα δεδομένα. Είσαι εντάξει με αυτό το σενάριο;

    Πες μας λίγα παραπάνω για τα στοιχεία που θέλεις να κρυπτογραφήσεις. Είναι passwords χρηστών; Είναι άλλα δεδομένα που ανήκουν σε συγκεκριμένους χρήστες; Ποιοι θα έχουν πρόσβαση σε αυτά;


    Χρήστος Γεωργακόπουλος
  •  22-03-2006, 13:38 10965 σε απάντηση της 10961

    Απ: Encyption-Decryption functions

    Αν είναι dll δεν χρειάζεται καν decompiler κάνει import to dll και επειδή είναι public οι functions απλά τις χρησημοποιεί.

    Οπότε πρέπει τα κλειδιά που χρησιμοποιείς νά τα αποθηκεύεις κάπου αλλού.

    Πάντως άν τα στοιχεία που θέλεις να κάνεις κρυπτογράφηση στην βάση δέν είναι ευαίσθητα (π.χ. password χρηστών) τότε νομίζω οτι το νακρυπτογραφείς ότι στέλνεις στην βάση θά έχει μεγάλη επίδραση στο performance του application.
    Ιωάννης Μανουσάκης
  •  22-03-2006, 14:06 10966 σε απάντηση της 10961

    Απ: Encyption-Decryption functions

    Κάποια δεδομένα στη βάση (πολύ μικρά κείμενα rtf) που κάποια από αυτά τα βλέπουν όλοι οι χρήστες, είναι λίγο ευαίσθητα και δεν θέλω να μπορεί ο καθένας να τα δει κάνοντας απλά ένα select.

    Βασικά δεν θέλω να προστατευθούν τα δεδομένα από τους χρήστες αλλά από κάποιο πχ περίεργο τεχνικό.

    Τα κλειδιά θα είναι στο ίδιο το exe γιατί δεν ξέρω που αλλού θα μπορούσαν να είναι. Όσον αφορά το performance μια μικρή καθυστέρηση είναι αποδεκτή.
  •  22-03-2006, 14:31 10968 σε απάντηση της 10966

    Απ: Encyption-Decryption functions

    Ο κώδικας που έχεις είναι σωστός αλλά ρίξε και μια ματιά σ'αυτό



    Imports System.Security.Cryptography

    Imports System.IO

    Imports System.Text

    Imports System.Web



    'SymmCrypto is a wrapper of System.Security.Cryptography.SymmetricAlgorithm classes

    'and simplifies the interface. It supports customized SymmetricAlgorithm as well.

    'Original Code from Frank Fang

    'Revised by Jerome Howard to remove Bad Data errors, create seperate CryptoIV and

    'use the maximum legal keysize for each encryption algorithm



    Public Class Crypto

    '256 Bit IV Key that is truncated when a smaller keys are required

    Private bytIV() As Byte = _

    {12, 241, 10, 21, 90, 74, 11, 39, 9, 91, 45, 78, 189, 211, 133, 62, 121, 22, 101, 34, 90, 74, 121, 39, 93, 9, 45, 78, 1, 211, 33, 162}



    'Supported .Net intrinsic SymmetricAlgorithm classes.

    Public Enum Providers

    DES

    RC2

    Rijndael

    End Enum



    Private _CryptoService As SymmetricAlgorithm



    'Constructor for using an intrinsic .Net SymmetricAlgorithm class.

    Public Sub New(ByVal NetSelected As Providers)

    Select Case NetSelected

    Case Providers.DES

    _CryptoService = New DESCryptoServiceProvider()

    Case Providers.RC2

    _CryptoService = New RC2CryptoServiceProvider()

    Case Providers.Rijndael

    _CryptoService = New RijndaelManaged()

    End Select

    End Sub



    'Constructor for using a customized SymmetricAlgorithm class.

    Public Sub New(ByVal ServiceProvider As SymmetricAlgorithm)

    _CryptoService = ServiceProvider

    End Sub



    'Depending on the legal key size limitations of a specific CryptoService provider

    'and length of the private key provided, padding the secret key with a character

    'or triming it to meet the legal size of the algorithm.

    Private Function GetLegalKey(ByVal Key As String) As Byte()

    'key sizes are in bits

    Dim sTemp As String

    If (_CryptoService.LegalKeySizes.Length > 0) Then

    Dim maxSize As Integer = _CryptoService.LegalKeySizes(0).MaxSize

    If Key.Length * 8 > maxSize Then

    sTemp = Key.Substring(0, (maxSize / 8))

    Else

    Dim moreSize As Integer = _CryptoService.LegalKeySizes(0).MinSize

    Do While (Key.Length * 8 > moreSize)

    moreSize += _CryptoService.LegalKeySizes(0).SkipSize

    Loop

    sTemp = Key.PadRight(moreSize / 8, "X")

    End If

    Else

    sTemp = Key

    End If



    'Ensure that the IV Block size is also correct for the specific CryptoService provider

    If (_CryptoService.LegalBlockSizes.Length > 0) Then

    Dim maxSize As Integer = _CryptoService.LegalBlockSizes(0).MaxSize

    ReDim Preserve bytIV(sTemp.Length - 1)

    If sTemp.Length * 8 > maxSize Then

    ReDim Preserve bytIV(maxSize / 8 - 1)

    End If

    End If

    'convert the secret key to byte array

    Return ASCIIEncoding.ASCII.GetBytes(sTemp)

    End Function



    Public Function Encrypt(ByVal Source As String, ByVal Key As String) As String

    Dim bytIn As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(System.Web.HttpUtility.UrlEncode(Source))

    Dim ms As MemoryStream = New MemoryStream()



    'set the keys

    _CryptoService.Key = GetLegalKey(Key)

    _CryptoService.IV = bytIV



    'create an Encryptor from the Provider Service instance

    Dim encrypto As ICryptoTransform = _CryptoService.CreateEncryptor()



    'create Crypto Stream that transforms a stream using the encryption

    Dim cs As CryptoStream = New CryptoStream(ms, encrypto, CryptoStreamMode.Write)



    'write out encrypted content into MemoryStream

    cs.Write(bytIn, 0, bytIn.Length)

    cs.FlushFinalBlock()

    cs.Close()

    Dim bytOut() As Byte = ms.ToArray()

    ms.Close()



    Return Convert.ToBase64String(bytOut) 'convert into Base64 so that the result can be used in xml

    End Function



    Public Function Decrypt(ByVal Source As String, ByVal Key As String) As String

    'convert from Base64 to binary

    Dim bytIn As Byte() = System.Convert.FromBase64String(Source)

    Dim ms As MemoryStream = New MemoryStream(bytIn)



    Dim bytKey() As Byte = GetLegalKey(Key)

    Dim bytTemp(bytIn.Length) As Byte



    'set the private key

    _CryptoService.Key = bytKey

    _CryptoService.IV = bytIV



    'create a Decryptor from the Provider Service instance

    Dim encrypto As ICryptoTransform = _CryptoService.CreateDecryptor()



    'create Crypto Stream that transforms a stream using the decryption

    Dim cs As CryptoStream = New CryptoStream(ms, encrypto, CryptoStreamMode.Read)

    Dim output As String

    Try

    'read out the result from the Crypto Stream

    Dim sr As New StreamReader(cs)

    output = sr.ReadToEnd

    sr.Close()

    ms.Close()

    cs.Close()

    Catch ex As Exception

    End Try

    Return System.Web.HttpUtility.UrlDecode(output) 'Encoding.ASCII.GetString(bytTemp))

    End Function



    End Class
    Ιωάννης Μανουσάκης
  •  22-03-2006, 14:33 10969 σε απάντηση της 10966

    Απ: Encyption-Decryption functions

    Αν χρησιμοποιήσεις SQL Server 2005 (σε όλες τις εκδόσεις, ακόμα και στην Express), παρέχεται native encryption που μπορείς να κάνεις implement σε συγκερκιμένα columns που θα επιλέξεις. Ως προς την αποθήκευση των κλειδιών αυτό είναι θέμα που απαιτεί αρκετά considerations. Αλλά γενικά να μπουν μέσα στο EXE δεν είναι και τόσο ευέλικτη λύση...


    Vir prudens non contra ventum mingit
  •  22-03-2006, 15:07 10975 σε απάντηση της 10961

    Απ: Encyption-Decryption functions

    Η βάση είναι Oracle 9,2
  •  22-03-2006, 18:16 10982 σε απάντηση της 10975

    Απ: Encyption-Decryption functions

    Χμμμ... Θα σου πρότεινα να ασχοληθείς με το Cryptography Application Block από την Enterprise Library.

    Ρίξε μια ματιά εδώ: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/entlibjan2006_cryptoappblock.asp

     


    Vir prudens non contra ventum mingit
  •  23-03-2006, 08:13 10996 σε απάντηση της 10961

    Απ: Encyption-Decryption functions

    KelMan αν δεν κάνω λάθος ο κώδικας που έδωσα παραπάνω κάνει αυτό που λές στο τελευταίο σου post. Διόρθωσέ με.
    Ιωάννης Μανουσάκης
  •  23-03-2006, 08:48 10997 σε απάντηση της 10996

    Απ: Encyption-Decryption functions

    Θα έλεγα, κάνει ΚΑΙ αυτό που έγραψες... Βασικά, το CAB είναι πλήρης βιβλιοθήκη, δηλαδή πέρα από το Encryption/Decryption με συμμετρικά κλειδιά, σου δίνει τη δυνατότητα να δημιουργήσεις και να συγκρίνεις hashes, πράγμα απαραίτητο για να αποθηκεύεις securely τα κλειδιά σου (πχ μέσα στη βάση) και να μην τα κάνεις embed στον κώδικα όπως λέγαμε παραπάνω. Επίσης, μέσα από το CAB μπορείς να χρησιμοποιήσεις το DPAPI που είναι πιο απλό στη χρήση καθώς χρησιμοποιεί το logon info για encryption/decryption.


    Vir prudens non contra ventum mingit
  •  23-03-2006, 22:51 11047 σε απάντηση της 10975

    Απ: Encyption-Decryption functions

     io_ wrote:
    Η βάση είναι Oracle 9,2

    Σήμερα έπεσα τυχαία σε αυτό το προϊόν: http://www.activecrypt.com/product.htm

    Είναι για SQL Server και Oracle. Έχει και free έκδοση χωρίς time limit, απλά με μερικούς περιορισμούς (14 χαρακτήρες password). Δεν το έχω δοκιμάσει αλλά φαίνεται ενδιαφέρον...


    Vir prudens non contra ventum mingit
  •  24-03-2006, 14:10 11069 σε απάντηση της 10961

    Απ: Encyption-Decryption functions

    Σας ευχαριστώ πολύ όλους :-)
  •  01-04-2006, 19:29 11454 σε απάντηση της 10961

    Απ: Encyption-Decryption functions

    Κλείνω την δημοσίευση ως "Εχει επιλυθεί", λογω του οτι υποψιάζομαι οτι επιλύθηκε.
    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems