Java, inbbygt stöd för kryptering?

Permalänk
Medlem

Java, inbbygt stöd för kryptering?

Tänkte bara höra med någon kunnig inom Javaprogrammering om det finns några inbyggda krypteringsalgoritmer man kan använda sig av i språket? Eller behövs det lite egenkodning för att få till detta?
Jag vill kryptera en textfil med någon form av kryptering.. Vad det är för typ av kryptering spelar mindre roll, bara texten i filen jag vill kryptera inte är läsbar hur som helst..

Det är alltså tänkt att programmet jag ska bygga ska läsa in den krypterade filen när programmet startar och dekryptera datan i filen och använda sig av vissa delar av den i programmet.. Inställningar och andra saker är det tänkt..

Kan eventuellt vara aktuellt att skapa programmet i C# också om det finns något "inbyggt stöd" där..

Visa signatur

WS: Mac Studio M1 Max | 32 GB | 1TB | Mac OS
WS: Intel i5 12600K | 64 GB DDR4 @3600 Mhz | 2x1TB nvme 2x1TB SSD SATA | Windows 11 & Manjaro Linux
Bärbar: Macbook Pro 14" | M1 Pro | 16GB RAM | 512GB SSD | Mac OS
Servrar: Intel i7 10700K | 64 GB DDR4 @3600Mhz | 3 TB SSD + 22TB HDD | Unraid |
4x Raspberry pi 4b 8Gb | Dietpi |

Permalänk
Medlem

Det finns mer än du vill ha,
http://java.sun.com/javase/6/docs/technotes/guides/security/c...
tror det är klassen du söker

Permalänk

C# har även det krypteringsfunktioner så välj vilket språk som passar bäst till det du ska skriva
http://support.microsoft.com/kb/307010

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Tackar för svar!

Visa signatur

WS: Mac Studio M1 Max | 32 GB | 1TB | Mac OS
WS: Intel i5 12600K | 64 GB DDR4 @3600 Mhz | 2x1TB nvme 2x1TB SSD SATA | Windows 11 & Manjaro Linux
Bärbar: Macbook Pro 14" | M1 Pro | 16GB RAM | 512GB SSD | Mac OS
Servrar: Intel i7 10700K | 64 GB DDR4 @3600Mhz | 3 TB SSD + 22TB HDD | Unraid |
4x Raspberry pi 4b 8Gb | Dietpi |

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Cooljmb
Det finns mer än du vill ha,
http://java.sun.com/javase/6/docs/technotes/guides/security/c...
tror det är klassen du söker

Det stämmer bra att det där verkar vara klassen jag söker..
Följdfråga till det..

Jag kommer använda mig av symmetrisk kryptering, d.v..s både mål och källa använder sig av samma nyckel för att kryptera / dekryptera.. De exempel jag stött på använder sig av en klass vid namn KeyGenerator för att generera en nyckel, men den verkar göra en randomnyckel vid varje körning av programmet typ.. Jag har en fil jag vill kryptera och programmet ska dekryptera datan i filen och använda vissa värden vid start av programmet.. Då måste jag ju använda samma och då gärna egenvalda nyckel vid kryptering / dekryptering..

Hur väljer jag en nyckel själv som ska användas vid krypteringen?
Alltså t.ex. att nyckeln är "abc123" ?

Visa signatur

WS: Mac Studio M1 Max | 32 GB | 1TB | Mac OS
WS: Intel i5 12600K | 64 GB DDR4 @3600 Mhz | 2x1TB nvme 2x1TB SSD SATA | Windows 11 & Manjaro Linux
Bärbar: Macbook Pro 14" | M1 Pro | 16GB RAM | 512GB SSD | Mac OS
Servrar: Intel i7 10700K | 64 GB DDR4 @3600Mhz | 3 TB SSD + 22TB HDD | Unraid |
4x Raspberry pi 4b 8Gb | Dietpi |

Permalänk

Här står det en del
http://forums.sun.com/thread.jspa?threadID=5419515&tstart=92

Förstår dock inte varför han blandat DES och AES... Jag skulle rekommendera köra på AES-128 bit, DES är osäker (och långsammare)

Visa signatur

Intel Core i7-3770K | Noctua NH-U12P SE2 | Corsair Vengeance LP 16GB | Asus P8Z77-V | Gigabyte GTX 670 2GB OC Windforce | Intel 520 240GB | Fractal Design Define R3 | Fractal Design Newton R2 650W |

Permalänk
Medlem

Lite nyfiken bara, varför vill du kryptera en fil med inställningar?

Det är ganska enkelt för en kunnig person att reverse-engineera ditt program och dekryptera innehållet så du kan ändå inte spara några "hemliga" uppgifter där.

Visa signatur

Assembly är ett högnivåspråk.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Gramner
Lite nyfiken bara, varför vill du kryptera en fil med inställningar?

Det är ganska enkelt för en kunnig person att reverse-engineera ditt program och dekryptera innehållet så du kan ändå inte spara några "hemliga" uppgifter där.

Egentligen bara för skojs skull och lära sig lite.. Programmet ska egentligen se till att uppdatera vissa användaruppgifter i en databas och i konfig-filen finns bland annat användarnamn och lösenord.. och det är ju inte jättekul att det står i klartext, därav krypteringen.. Sen att det går att reverse-engineera gör inte så mycket.. Inte många som kommer ha tillgång till programmet och de som har det kommer verkligen inte lyckas reverse-engineera min kod och läsa av lösenordet..

Visa signatur

WS: Mac Studio M1 Max | 32 GB | 1TB | Mac OS
WS: Intel i5 12600K | 64 GB DDR4 @3600 Mhz | 2x1TB nvme 2x1TB SSD SATA | Windows 11 & Manjaro Linux
Bärbar: Macbook Pro 14" | M1 Pro | 16GB RAM | 512GB SSD | Mac OS
Servrar: Intel i7 10700K | 64 GB DDR4 @3600Mhz | 3 TB SSD + 22TB HDD | Unraid |
4x Raspberry pi 4b 8Gb | Dietpi |

Permalänk
Citat:

Ursprungligen inskrivet av -=fredrik=-
Egentligen bara för skojs skull och lära sig lite.. Programmet ska egentligen se till att uppdatera vissa användaruppgifter i en databas och i konfig-filen finns bland annat användarnamn och lösenord.. och det är ju inte jättekul att det står i klartext, därav krypteringen.. Sen att det går att reverse-engineera gör inte så mycket.. Inte många som kommer ha tillgång till programmet och de som har det kommer verkligen inte lyckas reverse-engineera min kod och läsa av lösenordet..

MD5'a lösenordet med något fint salt (också). Så är det både krypterat och hashat.

Visa signatur

Citera, tack!
Har du läst tråden om strandhögtalare och andra musiklådor?

Permalänk

Lånar tråden lite..

Jag har tittat på sidorna som länkats och även några andra sidor, men jag förstår mig inte riktigt på koden som gjorts..

Jag förstår inte riktigt de steg som behöver göras.. Om jag förstått det rätt så går det inte bara ta en valfri string-variabel med ett lösenord i och sedan använda det som lösenord för att kryptera en text?

I många exempel blandas char[] in och massor olika klasser som jag inte riktigt fått grepp om.. bland annat

PBEKeySpec pbeKeySpec = new PBEKeySpec(SecretPhrase); SecretKeyFactory skeyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = skeyFactory.generateSecret(pbeKeySpec);

(finns att titta på i ovan länkade sida, några inlägg upp..)

Är det någon som är duktig på detta och kan förklara steg för steg vad som behöver göras för att få ett funktionsdugligt program (endast ett väldigt basic program, så kan jag bygga om det sen) där ett fast lösenord används för att kryptera innehållet i en fil, samt även dekryptera samma fil? Alltså ingen klass som själv skapar en nyckel eller liknande för varje körning utan jag vill själv välja lösenordet när jag kodar programmet. hårdkodat med andra ord...

Vidare används också detta frekvent i olika exempel när kryptering ska göras;

public static void main(String[] args) throws Exception { byte[] input = new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, (byte)0x88, (byte)0x99, (byte)0xaa, (byte)0xbb, (byte)0xcc, (byte)0xdd, (byte)0xee, (byte)0xff }; byte[] keyBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 };

Vad betyder allt detta?

Permalänk

Här är två metoder ur en skoluppgift jag hade :

/** * Laddar och krypterar upp kunddata från fil. * @param fileName filnamnet på filen som data ska laddas ur. * @param password lösenordet för att kryptera upp fildata */ public void loadDataFromFile(String fileName, char[] password) throws IOException, ClassNotFoundException, GeneralSecurityException { if (fileName == null) return; PBEKeySpec pbeKeySpec; PBEParameterSpec pbeParamSpec; SecretKeyFactory keyFac; byte[] salt = { (byte)0xa7, (byte)0x57, (byte)0xaa, (byte)0x0f, (byte)0x11, (byte)0xc8, (byte)0xe0, (byte)0x9e }; int interations = 20; pbeParamSpec = new PBEParameterSpec(salt, interations); pbeKeySpec = new PBEKeySpec(password); keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey key = keyFac.generateSecret(pbeKeySpec); Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES"); cipher.init(Cipher.DECRYPT_MODE, key, pbeParamSpec); FileInputStream fileIn = new FileInputStream(fileName); ObjectInputStream objectIn = new ObjectInputStream(new CipherInputStream(fileIn, cipher)); int size = objectIn.readInt(); customers.clear(); for (int n=0; n<size; n++) customers.add((Customer)objectIn.readObject()); fileIn.close(); objectIn.close(); } /** * Krypterar och sparar kunddata till fil. * @param fileName filnamnet på filen som data ska skrivas till * @param password lösenordet som ska användas till krypteringen. */ public void saveDataToFile(String fileName, char[] password) throws IOException, GeneralSecurityException { if (fileName == null) return; PBEKeySpec pbeKeySpec; PBEParameterSpec pbeParamSpec; SecretKeyFactory keyFac; byte[] salt = { (byte)0xa7, (byte)0x57, (byte)0xaa, (byte)0x0f, (byte)0x11, (byte)0xc8, (byte)0xe0, (byte)0x9e }; int interations = 20; pbeParamSpec = new PBEParameterSpec(salt, interations); pbeKeySpec = new PBEKeySpec(password); keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey key = keyFac.generateSecret(pbeKeySpec); Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES"); cipher.init(Cipher.ENCRYPT_MODE, key, pbeParamSpec); FileOutputStream fileOut = new FileOutputStream(fileName); ObjectOutputStream objectOut = new ObjectOutputStream(new CipherOutputStream(fileOut, cipher)); /* CipherOutputStream kopplas på i strömmen för att kryptera data som skrivs till filen */ objectOut.writeInt(customers.size()); for(int n = 0; n < customers.size(); n++) objectOut.writeObject((Customer)customers.get(n)); objectOut.flush(); objectOut.close(); fileOut.close(); }

Den ena metoden skriver ut en int med antalet kundobjekt följt av själva kund-objekten, den andra metoden läser in detta. Som du ser har jag kopplat på krypteringen på ObjectInputStream och ObjectOutputStream.

Kanske hjälper dig att förstå genom att se ett enkelt och fungerande exempel.

OBS! Krypteringsalgoritmen jag valt kan vara allt annat än optimalt, det var ingenting som jag ägnade en tanke åt, ville bara att det skulle fungera.

Visa signatur

e6600@3.2GHz@1.35v + P5B deluxe + corsair 2gb pc6400 + HD4350 m.m.

Permalänk
Citat:

Ursprungligen inskrivet av sl2wm-rocks
Här är två metoder ur en skoluppgift jag hade :

/** * Laddar och krypterar upp kunddata från fil. * @param fileName filnamnet på filen som data ska laddas ur. * @param password lösenordet för att kryptera upp fildata */ public void loadDataFromFile(String fileName, char[] password) throws IOException, ClassNotFoundException, GeneralSecurityException { if (fileName == null) return; PBEKeySpec pbeKeySpec; PBEParameterSpec pbeParamSpec; SecretKeyFactory keyFac; byte[] salt = { (byte)0xa7, (byte)0x57, (byte)0xaa, (byte)0x0f, (byte)0x11, (byte)0xc8, (byte)0xe0, (byte)0x9e }; int interations = 20; pbeParamSpec = new PBEParameterSpec(salt, interations); pbeKeySpec = new PBEKeySpec(password); keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey key = keyFac.generateSecret(pbeKeySpec); Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES"); cipher.init(Cipher.DECRYPT_MODE, key, pbeParamSpec); FileInputStream fileIn = new FileInputStream(fileName); ObjectInputStream objectIn = new ObjectInputStream(new CipherInputStream(fileIn, cipher)); int size = objectIn.readInt(); customers.clear(); for (int n=0; n<size; n++) customers.add((Customer)objectIn.readObject()); fileIn.close(); objectIn.close(); } /** * Krypterar och sparar kunddata till fil. * @param fileName filnamnet på filen som data ska skrivas till * @param password lösenordet som ska användas till krypteringen. */ public void saveDataToFile(String fileName, char[] password) throws IOException, GeneralSecurityException { if (fileName == null) return; PBEKeySpec pbeKeySpec; PBEParameterSpec pbeParamSpec; SecretKeyFactory keyFac; byte[] salt = { (byte)0xa7, (byte)0x57, (byte)0xaa, (byte)0x0f, (byte)0x11, (byte)0xc8, (byte)0xe0, (byte)0x9e }; int interations = 20; pbeParamSpec = new PBEParameterSpec(salt, interations); pbeKeySpec = new PBEKeySpec(password); keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey key = keyFac.generateSecret(pbeKeySpec); Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES"); cipher.init(Cipher.ENCRYPT_MODE, key, pbeParamSpec); FileOutputStream fileOut = new FileOutputStream(fileName); ObjectOutputStream objectOut = new ObjectOutputStream(new CipherOutputStream(fileOut, cipher)); /* CipherOutputStream kopplas på i strömmen för att kryptera data som skrivs till filen */ objectOut.writeInt(customers.size()); for(int n = 0; n < customers.size(); n++) objectOut.writeObject((Customer)customers.get(n)); objectOut.flush(); objectOut.close(); fileOut.close(); }

Den ena metoden skriver ut en int med antalet kundobjekt följt av själva kund-objekten, den andra metoden läser in detta. Som du ser har jag kopplat på krypteringen på ObjectInputStream och ObjectOutputStream.

Kanske hjälper dig att förstå genom att se ett enkelt och fungerande exempel.

OBS! Krypteringsalgoritmen jag valt kan vara allt annat än optimalt, det var ingenting som jag ägnade en tanke åt, ville bara att det skulle fungera.

Tack för ett bra exempel ! Har visst missat att kolla denna tråd igen..
Jag får det dock inte riktigt att fungera.. Reder inte riktigt ut skillnaden mellan en ObjectOutputStream och en bufferedReader t.ex..

Om jag använder mig av ditt exempel så verkar krypteringsmetoden (d.v.s. den som sparar kunddata) fungera utan problem.. Data skrivs till en fil jag har, krypterat och klart..
Men sen när jag ska läsa in den här datan igen så råkar jag på problem..
Jag får bara en java.io.OptionalDataException hela tiden..

Vad kan det bero på?
Det händer när jag försöker läsa in datan jag har genom objectIn.readObject(); ...

Men hur som helst, om jag nu istället vill använda mig av t.ex. en BufferedReader och en BufferedWriter för att läsa in respektive skriva data från/till filen, hur går jag tillväga då? Verkar inte som jag kan använda klassen CipherOutputStream eller CipherInputStream med en BufferedReader eller BufferedWriter..
Hur kan jag göra då?
Låt säga att jag krypterar datan i filen och sen skickar ut den krypterade datan med en BufferedWriter.. Hur går jag tillväga för att få texten krypterad?
I ditt fall kopplar du ju på kryptering i utströmmen, men om jag vill lösa krypteringen innan jag skriver till filen alltså..?

Man kan ju bli förvirrad av mindre..

Permalänk

Enligt javadoc så är OptionalDataException :
* An attempt was made to read an object when the next element in the stream is primitive data. In this case, the OptionalDataException's length field is set to the number of bytes of primitive data immediately readable from the stream, and the eof field is set to false.
* An attempt was made to read past the end of data consumable by a class-defined readObject or readExternal method. In this case, the OptionalDataException's eof field is set to true, and the length field is set to 0.

Så anledningen är nog att du försöker läsa ett objekt när det egentligen är ett primitivt datatyp som ligger där. Mitt exempel skriver ju först ut en int som visar hur många poster som kommer efter, därför måste du först läsa in den med objectin.readInt() och använda dig av readobject() sen.
Som här:
int size = objectIn.readInt();
for (int n=0; n<size; n++)
customers.add((Customer)objectIn.readObject());

Ska du alltid spara och läsa in samma antal objekt behöver du ju inte skriva ut något heltal först, och kan då skippa läsa in den också. Du kan också skriva ut en hel ArrayList objekt också.

Visa signatur

e6600@3.2GHz@1.35v + P5B deluxe + corsair 2gb pc6400 + HD4350 m.m.

Permalänk

Har inte provat att använda BuferredWriter/-Reader tillsammans med Cipher, men det måste ju gå att koppla på den också.

Visa signatur

e6600@3.2GHz@1.35v + P5B deluxe + corsair 2gb pc6400 + HD4350 m.m.