Behöver ett bra sätt att kryptera en (lösenords-)sträng. Kolla in denna artikel (handlar bl.a. om att Hasha lösenord): Du kan använda dig av namespacet System.Security.Cryptography och använda dig av RSA. Här har du ett komplett exempel, det andra va bara utdragen kod för att visa lite hur man kan använda RSA. <code> Använder: Fick det att funka! (var tvungen att spara nycklarna :-P) Testa med att serializera RSAParameters objektet på disk och sedan vid använding deserializera det. Kör med toXMLString på både public o private... Här har du exempel kod på hur du serializerar ett objekt. Ser ut som JScript, skrev om till: Har du verkligen tänkt igenom det här ordentligt? Hur ska lösenordet användas och från vem ska det skyddas? Låt inte kryptering invagga dig i någon falsk säkerhet. Får någon tillgång till dina sparade privata/publika nycklar så är inte krypteringen värt ett skvatt. Jag vet.. men hur ska jag kunna lagra dem då? Fredrik: Det verkar som det blir nåt fel vid serializeringen, allt funkar första gången (innan det har serializerats) men andra gången (när nycklarna läses från filen) så blir det fel på Hashen Hej. En lösning är att du kör DES istället för RSA, baseras på en nyckel som du kan spara undan. Des är en symetrisk algoritm så du använder bara en nyckel för att packa och samma för att packa upp. Har själv inte testat att serillizera RSAParameters. Jag brukar inte köra med kryptering där jag behöver decryptera, men där jag skulle göra det, så skulle jag använda mig av Microsoft Crypt API, crypt32.dll. Om du går in på Microsoft site msdn.microsoft.com och tankar ner Petshop 3.0, så finns det exempel där de använder crypt32.dll för att kryptera odh dekryptera connection strängar som de lagrara i web.config.Kryptering
Om nyckel behövs (antar jag), så gärna tips på hur jag kan få den från datorns hårdvara/os (så att den inte funkar på nån annan dator)
Nåt med system.cryptography??
//Thomas
PS. Förstås vill jag kunna dekryptera den oxå ;-)Sv: Kryptering
http://www.dotnetfriends.com/templates/Page.aspx?id=2112Sv: Kryptering
Hör kommer lite exempel kod:
Encrypt:
<code>
byte[] dataToEncrypt = ByteConverter.GetBytes("Data to Encrypt");
byte[] encryptedData;
byte[] decryptedData;
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//RSA Key information.
RSA.ImportParameters(RSAKeyInfo);
encryptedData = RSA.Encrypt(DataToEncrypt, false);
</code>
Decrypt:
<code>
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//RSA Key information.
RSA.ImportParameters(RSAKeyInfo);
decryptedData = RSA.Decrypt(encryptedData, false);
</code>
Hoppas detta löser dina problem.
/Fredrik NSv: Kryptering
Om du går inte på .Net SDK och slår upp "RSACryptoServiceProvider class" så har du ett exempel där som du kan se på om du vill ha fullständig kod.
Om du ska enbart köra med Windows som platform så kan du göra en DLLImport på crypt32.dll och använda dess cryptering och decryptering.
/Fredrik NSv: Kryptering
Dim kryptvärde As Byte
Dim RSA As New RSACryptoServiceProvider()
TypeDescriptor.GetConverter(kryptvärde).ConvertFromString(värde)
Return RSA.Encrypt(kryptvärde, False)
</code>
D:\Thomas mapp\Mina Dokument\Visual Studio Projects\TeliaADSL\modTelia.vb(208): Value of type 'Byte' cannot be converted to '1-dimensional array of Byte'.
Hur fixar jag det där med array-grejen? (kryptvärde på sista raden ger felet)Sv: Kryptering
<code>
Function dekryptera(ByVal värde As String)
MsgBox("dk1: " & värde)
Dim kryptvärde As Byte()
Dim RSA As New RSACryptoServiceProvider()
kryptvärde = System.Text.UnicodeEncoding.Unicode.GetBytes(värde)
kryptvärde = RSA.Decrypt(kryptvärde, False)
värde = System.Text.UnicodeEncoding.Unicode.GetChars(kryptvärde)
MsgBox("dk1: " & värde)
Return värde
End Function
Function kryptera(ByVal värde As String)
MsgBox("k1: " & värde)
Dim kryptvärde As Byte()
Dim RSA As New RSACryptoServiceProvider()
kryptvärde = System.Text.UnicodeEncoding.Unicode.GetBytes(värde)
kryptvärde = RSA.Encrypt(kryptvärde, False)
värde = System.Text.UnicodeEncoding.Unicode.GetChars(kryptvärde)
MsgBox("k2: " & värde)
Return värde
End Function
</code>
men dekrypteringsfunktionen får felet: "fel längd" på decrypt-raden, fast jag tar och skickar den krypterade strängen direkt till dekryptera
beror det på att den ändrar nån krypteringsgrej varje gång den körs?Sv: Kryptering
<code>
Function kryptera(ByVal värde As String) As String
MsgBox("k1: " & värde)
Dim kryptvärde As Byte()
Dim CSPParam As New CspParameters()
CSPParam.Flags = CspProviderFlags.UseMachineKeyStore
Dim RSA As New RSACryptoServiceProvider(CSPParam)
kryptvärde = System.Text.UnicodeEncoding.Unicode.GetBytes(värde)
Debug.WriteLine(kryptvärde)
kryptvärde = RSA.Encrypt(kryptvärde, False)
värde = System.Text.UnicodeEncoding.Unicode.GetChars(kryptvärde)
rsaParam = RSA.ExportParameters(True)
MsgBox("k2: " & värde)
Return värde
End Function
Function dekryptera(ByVal värde As String) As String
MsgBox("dk1: " & värde)
Dim kryptvärde As Byte()
Dim CSPParam As New CspParameters()
CSPParam.Flags = CspProviderFlags.UseMachineKeyStore
Dim RSA As New RSACryptoServiceProvider(CSPParam)
RSA.ImportParameters(rsaParam)
kryptvärde = System.Text.UnicodeEncoding.Unicode.GetBytes(värde)
Debug.WriteLine(kryptvärde)
kryptvärde = RSA.Decrypt(kryptvärde, False)
värde = System.Text.UnicodeEncoding.Unicode.GetChars(kryptvärde)
MsgBox("dk1: " & värde)
Return värde
End Function
</code>
Men kan jag spara dem när mitt program är avstängt? Skulle helst spara dem i registret om det går på nåt säkert sätt
Eller är det bättre att spara den publika och ha en fast privat? (programmet ska fixa det här av sig självt)Sv: Kryptering
/Fredrik NSv: Kryptering
Om nån läser Xml-filen kan väl de få fram den krypterade texten? :-/Sv: Kryptering
<code>
MyObject obj = new MyObject();
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();
</code>
<code>
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(stream);
stream.Close();
</code>
Du kan tex göra detta med ditt RSAParameter "rsaParam" object.
/Fredrik NSv: Kryptering
<code>
Function serializera(ByVal objObjekt As Object, ByVal strFil As String)
Dim formatter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
Dim stream As New FileStream(strFil & ".bin", FileMode.Create, FileAccess.Write, FileShare.None)
formatter.Serialize(stream, objObjekt)
stream.Close()
End Function
Function avserializera(ByVal strFil As String)
Dim objObjekt As Object
Dim formatter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
Dim stream As New FileStream(strFil & ".bin", FileMode.Open, FileAccess.Read, FileShare.Read)
objObjekt = formatter.Deserialize(stream)
stream.Close()
End Function
</code>Sv: Kryptering
MSSv: Kryptering
Jag har ett program för inloggning till Telia ADSL och det ska spara användarens lösenord krypterat..
Finns det nån bättre metod?
Borde jag köra med symmetrisk kryptering och ha nyckeln lagrad i programmet? (Kan ingen kolla den ändå :-/)
Eller kan jag spara den i Windows på nåt sätt?
//ThomasSv: Kryptering
Sv: Kryptering
Bygge själv en DSL inloggnings service för Telia, som då även updaterar min dyndns då ip-adressen ändras. Jag valde att inte köra krypterat lösenord, dels av den anledningen att det är jag själv som kör med den, samt så är det inte så vanligt att ens polare rotar omkring i mitt register. Så egentligen behöver du ju inte köra kryptering på den. Men annars är DES ett bra allternativ.
Mvh JohanSv: Kryptering
/Fredrik N