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

-
Μέλος από τις 09-12-2005
-
Καρδίτσα
-
Δημοσιεύσεις 141
-
-
|
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
|
|
Απ: Encyption-Decryption functions
Οπότε αν ανοίξει κάποιος το dll ή το exe σου με έναν decompiler, μπορεί να διαβάσει τα κλειδιά που χρησιμοποιείς, και αν αποκτήσει πρόσβαση στη βάση θα μπορέσει να αποκρυπτογραφήσει όλα σου τα δεδομένα. Είσαι εντάξει με αυτό το σενάριο;
Πες μας λίγα παραπάνω για τα στοιχεία που θέλεις να κρυπτογραφήσεις. Είναι passwords χρηστών; Είναι άλλα δεδομένα που ανήκουν σε συγκεκριμένους χρήστες; Ποιοι θα έχουν πρόσβαση σε αυτά;
Χρήστος Γεωργακόπουλος
|
|
-
22-03-2006, 13:38
|
-
imanos
-
-

-
Μέλος από τις 24-01-2006
-
Ναυπλιο
-
Δημοσιεύσεις 221
-
-
|
Απ: Encyption-Decryption functions
Αν είναι dll δεν χρειάζεται καν decompiler κάνει import to dll και επειδή είναι public οι functions απλά τις χρησημοποιεί.
Οπότε πρέπει τα κλειδιά που χρησιμοποιείς νά τα αποθηκεύεις κάπου αλλού.
Πάντως άν τα στοιχεία που θέλεις να κάνεις κρυπτογράφηση στην βάση δέν είναι ευαίσθητα (π.χ. password χρηστών) τότε νομίζω οτι το νακρυπτογραφείς ότι στέλνεις στην βάση θά έχει μεγάλη επίδραση στο performance του application.
Ιωάννης Μανουσάκης
|
|
-
22-03-2006, 14:06
|
-
Ioannis P
-
-

-
Μέλος από τις 09-12-2005
-
Καρδίτσα
-
Δημοσιεύσεις 141
-
-
|
Απ: Encyption-Decryption functions
Κάποια δεδομένα στη βάση (πολύ μικρά κείμενα rtf) που κάποια από αυτά τα βλέπουν όλοι οι χρήστες, είναι λίγο ευαίσθητα και δεν θέλω να μπορεί ο καθένας να τα δει κάνοντας απλά ένα select.
Βασικά δεν θέλω να προστατευθούν τα δεδομένα από τους χρήστες αλλά από κάποιο πχ περίεργο τεχνικό.
Τα κλειδιά θα είναι στο ίδιο το exe γιατί δεν ξέρω που αλλού θα μπορούσαν να είναι. Όσον αφορά το performance μια μικρή καθυστέρηση είναι αποδεκτή.
|
|
-
22-03-2006, 14:31
|
-
imanos
-
-

-
Μέλος από τις 24-01-2006
-
Ναυπλιο
-
Δημοσιεύσεις 221
-
-
|
Απ: 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
|
-
KelMan
-
-
-
Μέλος από τις 03-11-2004
-
Planet Earth
-
Δημοσιεύσεις 2.851
-
-
|
Απ: Encyption-Decryption functions
Αν χρησιμοποιήσεις SQL Server 2005 (σε όλες τις εκδόσεις, ακόμα και στην Express), παρέχεται native encryption που μπορείς να κάνεις implement σε συγκερκιμένα columns που θα επιλέξεις. Ως προς την αποθήκευση των κλειδιών αυτό είναι θέμα που απαιτεί αρκετά considerations. Αλλά γενικά να μπουν μέσα στο EXE δεν είναι και τόσο ευέλικτη λύση...
Vir prudens non contra ventum mingit
|
|
-
22-03-2006, 15:07
|
-
22-03-2006, 18:16
|
-
23-03-2006, 08:13
|
-
imanos
-
-

-
Μέλος από τις 24-01-2006
-
Ναυπλιο
-
Δημοσιεύσεις 221
-
-
|
Απ: Encyption-Decryption functions
KelMan αν δεν κάνω λάθος ο κώδικας που έδωσα παραπάνω κάνει αυτό που λές στο τελευταίο σου post. Διόρθωσέ με.
Ιωάννης Μανουσάκης
|
|
-
23-03-2006, 08:48
|
-
KelMan
-
-
-
Μέλος από τις 03-11-2004
-
Planet Earth
-
Δημοσιεύσεις 2.851
-
-
|
Απ: 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
|
-
KelMan
-
-
-
Μέλος από τις 03-11-2004
-
Planet Earth
-
Δημοσιεύσεις 2.851
-
-
|
Απ: Encyption-Decryption functions
io_ wrote: | |
Σήμερα έπεσα τυχαία σε αυτό το προϊόν: 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
|
-
|
|
|