/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Kryptering
Fra : Michael Banzon


Dato : 15-05-03 08:17

Hej, jeg har de to funktioner angivet nedenfor (undskyld de
danske tegn, ikke mit designvalg ). Men de kaster en
java.io.StreamCorruptedException når jeg forsøger at indlæse
objectet igen... Er der nogen der ved hvad der kunne være galt?

/ Michael

Her er funktionerne:

public static boolean krypterTilDisk(String fil, Serializable objekt) {
try {
KeySpec nøgleSpecifikationer = new
PBEKeySpec(KRYPTERINGSNØGLE.toCharArray(), SALT, KRYPTERINGSITERATIONER);
SecretKey nøgle =
SecretKeyFactory.getInstance(KRYPTERINGSALGORITME).generateSecret(nøgleSpeci
fikationer);
Cipher cipher = Cipher.getInstance(nøgle.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, nøgle);
SealedObject krypteretObjekt = new SealedObject(objekt, cipher);

ObjectOutputStream objektSkriver = new ObjectOutputStream(new
FileOutputStream(fil));
objektSkriver.writeObject(krypteretObjekt);
objektSkriver.close();

return true;
} catch(Exception e) {
e.printStackTrace(System.out);
return false;
}
}

public static Object dekrypterFraDisk(String fil) {
try {
KeySpec nøgleSpecifikationer = new
PBEKeySpec(KRYPTERINGSNØGLE.toCharArray(), SALT, KRYPTERINGSITERATIONER);
SecretKey nøgle =
SecretKeyFactory.getInstance(KRYPTERINGSALGORITME).generateSecret(nøgleSpeci
fikationer);
Cipher cipher = Cipher.getInstance(nøgle.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, nøgle);

ObjectInputStream objektLæser = new ObjectInputStream(new
FileInputStream(fil));
SealedObject krypteretObjekt = (SealedObject)(objektLæser.readObject());
objektLæser.close();

return krypteretObjekt.getObject(cipher);
} catch(Exception e) {
e.printStackTrace(System.out);
return null;
}
}


Og konstanterne:


public static final String KRYPTERINGSALGORITME = "PBEWithMD5AndDES";
public static final String KRYPTERINGSNØGLE = "fooBAR";

public static final byte[] SALT = {(byte)0xA9, (byte)0x9B, (byte)0xC8,
(byte)0x32,
(byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03};
public static final int KRYPTERINGSITERATIONER = 20;



 
 
Michael Banzon (15-05-2003)
Kommentar
Fra : Michael Banzon


Dato : 15-05-03 08:24

"Michael Banzon" <anyone@anywhere.anyhow> skrev i en meddelelse
news:b9vesg$lme$1@sunsite.dk...
> BLAAAAAABLAAAA

Undskyld det store grimme indlæg, hvis det er nødvændigt at
se koden i et pænere format, så sig til

/ Michael



Soren Davidsen (16-05-2003)
Kommentar
Fra : Soren Davidsen


Dato : 16-05-03 10:32

"Michael Banzon" <anyone@anywhere.anyhow> writes:

> "Michael Banzon" <anyone@anywhere.anyhow> skrev i en meddelelse
> news:b9vesg$lme$1@sunsite.dk...
> > BLAAAAAABLAAAA
>
> Undskyld det store grimme indlæg, hvis det er nødvændigt at
> se koden i et pænere format, så sig til

Proev at give en PBEParameterSpec til cipher.init istedet for i KeySpec'en.

Se: http://turtle.math.klte.hu/~flower/Banzon.java for hvad jeg mener.

Iøvrigt plejer jeg at bruge en CipherOutputStream istedet for sealedobject
konstruktionen, så jeg kunne da godt tænke mig at høre lidt om hvad
fordelene er ved din metode ?


Mvh,

--
___
Soren Davidsen / o\
Deliver yesterday, code today, think tomorrow. (_____)
__ http://www.tanesha.net/ _________________________________(___)_______

Michael Banzon (16-05-2003)
Kommentar
Fra : Michael Banzon


Dato : 16-05-03 21:52

"Soren Davidsen" <soren200303@tanesha.net> skrev i en meddelelse
news:87vfwb1bld.fsf@tanesha.net...
> Proev at give en PBEParameterSpec til cipher.init istedet for i
KeySpec'en.

jep, takker og bukker...

> Se: http://turtle.math.klte.hu/~flower/Banzon.java for hvad jeg mener.

Fantatisk, nu kan jeg sove igen

> Iøvrigt plejer jeg at bruge en CipherOutputStream istedet for sealedobject
> konstruktionen, så jeg kunne da godt tænke mig at høre lidt om hvad
> fordelene er ved din metode ?

Hmm... det er første gang at jeg (selv) laver noget med kryptering. Så
jeg har ikke rigtigt prøvet din metode. Jeg søgte bare på Java Almanac
(www.javaalmanac.com) for at finde noget der kunne kryptere objekter.
Kan godt se, nu at du siger det, at jeg kunne ha søgt efter kryptering
af streams men nu sad jeg og kunne ikke finde ud af at kryptere
objekter, hvorimod af jeg godt vidste hvordan at jeg skulle skrive
objekter til disk hmmm... ved ikke hvad jeg foretrækker...

Er der evt. andre der kunne nævne fordele/ulemper ved ovenstående
metoder???

/ Michael

P.S. Endnu en gang tak, jeg var virkeligt kørt fast!



Morten Blinksbjerg N~ (15-05-2003)
Kommentar
Fra : Morten Blinksbjerg N~


Dato : 15-05-03 16:14

> Hej, jeg har de to funktioner angivet nedenfor (undskyld de
> danske tegn, ikke mit designvalg ). Men de kaster en
> java.io.StreamCorruptedException når jeg forsøger at indlæse
> objectet igen... Er der nogen der ved hvad der kunne være galt?

Er der slet ikke nogen der kan svare ham? - Han sidder her overfor
mig og ser ud til at være meget ked af det p.g.a. af at der ikke
er nogen der har svaret ham endnu...

--
Morten Blinksbjerg Nielsen, Odense
http://www.mbn.dk/ - http://www.websmed.dk/


Ulrik Magnusson (16-05-2003)
Kommentar
Fra : Ulrik Magnusson


Dato : 16-05-03 16:58



Michael Banzon wrote:

> Hej, jeg har de to funktioner angivet nedenfor (undskyld de
> danske tegn, ikke mit designvalg ). Men de kaster en
> java.io.StreamCorruptedException når jeg forsøger at indlæse
> objectet igen... Er der nogen der ved hvad der kunne være galt?

Du mangler at give et AlgorithmParameters objekt med til Cipher.init()
metoden. Nu ved jeg ikke så meget om dette, så jeg prøvede at
generere et sådant med
java.security.AlgorithmParameterGenerator.generateParameters()
men så fik jeg denne:

java.security.NoSuchAlgorithmException: PBEWITHMD5ANDDES
AlgorithmParameterGenerator not available
at java.security.Security.getEngineClassName(Security.java:583)
at java.security.Security.getEngineClassName(Security.java:594)
at java.security.Security.getImpl(Security.java:1043)
at java.security.AlgorithmParameterGenerator.getInstance(
AlgorithmParameterGenerator.java:117)
at Krypt.dekrypterFraDisk(Krypt.java:54)

så fuskede jeg og gemte et AlgorithmParameters objekt fra krypteringen,
og så virkede det sørme:


import javax.crypto.*;
import java.io.*;
import javax.crypto.spec.*;
import java.security.spec.*;
import java.security.*;

class Krypt
{
public static final String KRYPTERINGSALGORITME = "PBEWithMD5AndDES";
public static final String KRYPTERINGSNØGLE = "fooBAR";

public static final byte[] SALT = {(byte)0xA9, (byte)0x9B, (byte)0xC8,
(byte)0x32,
(byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03};
public static final int KRYPTERINGSITERATIONER = 20;
private static AlgorithmParameters params;

public static boolean krypterTilDisk(String fil, Serializable objekt) {
try {
KeySpec nøgleSpecifikationer = new
PBEKeySpec(KRYPTERINGSNØGLE.toCharArray(), SALT, KRYPTERINGSITERATIONER);
SecretKey nøgle =
SecretKeyFactory.getInstance(KRYPTERINGSALGORITME).generateSecret(nøgleSpecifikationer);

Cipher cipher = Cipher.getInstance(nøgle.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, nøgle);
params = cipher.getParameters();
SealedObject krypteretObjekt = new SealedObject(objekt, cipher);

ObjectOutputStream objektSkriver = new ObjectOutputStream(new
FileOutputStream(fil));
objektSkriver.writeObject(krypteretObjekt);

objektSkriver.close();

return true;
} catch(Exception e) {
e.printStackTrace(System.out);
return false;
}
}

public static Object dekrypterFraDisk(String fil) {
try {
KeySpec nøgleSpecifikationer = new
PBEKeySpec(KRYPTERINGSNØGLE.toCharArray(), SALT, KRYPTERINGSITERATIONER);
SecretKey nøgle =
SecretKeyFactory.getInstance(KRYPTERINGSALGORITME).generateSecret(nøgleSpecifikationer);

Cipher cipher = Cipher.getInstance(nøgle.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, nøgle, params );

ObjectInputStream objektLæser = new ObjectInputStream(new
FileInputStream(fil));
SealedObject krypteretObjekt = (SealedObject)(objektLæser.readObject());
objektLæser.close();

return krypteretObjekt.getObject(cipher);
} catch(Exception e) {
e.printStackTrace(System.out);
return null;
}
}


public static void main( String[] args )
{
java.util.Vector vec = new java.util.Vector();
vec.add("Hello");
krypterTilDisk( "hello.txt", vec);
java.util.Vector res = (java.util.Vector)dekrypterFraDisk( "hello.txt");
System.out.println( res.get(0) );
}
}

Ulrik Magnusson


Ulrik Magnusson (16-05-2003)
Kommentar
Fra : Ulrik Magnusson


Dato : 16-05-03 17:31



Ulrik Magnusson wrote:

> så fuskede jeg og gemte et AlgorithmParameters objekt fra krypteringen,
> og så virkede det sørme:

det bliver selvfølgelig lidt pænere, hvis man kan kalde dekrypteringsmetoden
uden at skulle kalde krypteringsmetoden først:

import javax.crypto.*;
import java.io.*;
import javax.crypto.spec.*;
import java.security.spec.*;
import java.security.*;

class Krypt
{
public static final String KRYPTERINGSALGORITME = "PBEWithMD5AndDES";
public static final String KRYPTERINGSNØGLE = "fooBAR";

public static final byte[] SALT = {(byte)0xA9, (byte)0x9B, (byte)0xC8,
(byte)0x32,
(byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03};
public static final int KRYPTERINGSITERATIONER = 20;

private static Cipher cipherCr;
private static Cipher cipherEncr;
private static boolean initialized = false;

private synchronized static void init() throws Exception
{
if( initialized )
{
return;
}
KeySpec nøgleSpecifikationer = new
PBEKeySpec( KRYPTERINGSNØGLE.toCharArray(),
SALT,
KRYPTERINGSITERATIONER);
SecretKey nøgle =

SecretKeyFactory.getInstance(KRYPTERINGSALGORITME).generateSecret(nøgleSpecifikationer);
cipherCr = Cipher.getInstance(nøgle.getAlgorithm());
cipherCr.init(Cipher.ENCRYPT_MODE, nøgle);
cipherEncr = Cipher.getInstance(nøgle.getAlgorithm());
cipherEncr.init(Cipher.DECRYPT_MODE, nøgle, cipherCr.getParameters() );
initialized = true;
}

public static boolean krypterTilDisk(String fil, Serializable objekt) {
try {
init();
SealedObject krypteretObjekt = new SealedObject(objekt, cipherCr);
ObjectOutputStream objektSkriver = new ObjectOutputStream(new FileOutputStream(fil));
objektSkriver.writeObject(krypteretObjekt);
objektSkriver.close();
return true;
} catch(Exception e) {
e.printStackTrace(System.out);
return false;
}
}

public static Object dekrypterFraDisk(String fil) {
try {
init();
ObjectInputStream objektLæser = new ObjectInputStream(new FileInputStream(fil));
SealedObject krypteretObjekt = (SealedObject)(objektLæser.readObject());
objektLæser.close();
return krypteretObjekt.getObject(cipherEncr);
} catch(Exception e) {
e.printStackTrace(System.out);
return null;
}
}

public static void main( String[] args )
{
java.util.Vector vec = new java.util.Vector();
vec.add("Hello");
krypterTilDisk( "hello.txt", vec);
java.util.Vector res = (java.util.Vector)dekrypterFraDisk( "hello.txt");
System.out.println( res.get(0) );
}

}

Ulrik Magnusson


Soren Davidsen (16-05-2003)
Kommentar
Fra : Soren Davidsen


Dato : 16-05-03 20:16

Ulrik Magnusson <ulrikm@yahoo.com> writes:

> Ulrik Magnusson wrote:
>
> > så fuskede jeg og gemte et AlgorithmParameters objekt fra krypteringen,
> > og så virkede det sørme:
>
> det bliver selvfølgelig lidt pænere, hvis man kan kalde dekrypteringsmetoden
> uden at skulle kalde krypteringsmetoden først:
>
[snip]

... men jeg ville personligt ikke vaere glad for et design der gemmer
statiske variable med ciphers, bedre med saa smaa scopes saa muligt..


Mvh,

--
___
Soren Davidsen / o\
Deliver yesterday, code today, think tomorrow. (_____)
__ http://www.tanesha.net/ _________________________________(___)_______

Ulrik Magnusson (17-05-2003)
Kommentar
Fra : Ulrik Magnusson


Dato : 17-05-03 01:54



Soren Davidsen wrote:

> Ulrik Magnusson <ulrikm@yahoo.com> writes:
>
> > Ulrik Magnusson wrote:
> >
> > > så fuskede jeg og gemte et AlgorithmParameters objekt fra krypteringen,
> > > og så virkede det sørme:
> >
> > det bliver selvfølgelig lidt pænere, hvis man kan kalde dekrypteringsmetoden
> > uden at skulle kalde krypteringsmetoden først:
> >
> [snip]
>
> .. men jeg ville personligt ikke vaere glad for et design der gemmer
> statiske variable med ciphers, bedre med saa smaa scopes saa muligt..

men uendeligt dyrt.. Jeg kan nu ikke se sikkerhedsbristen, da man alligevel
kan generere de tilføjede variabler ud fra de allerede eksisterende public
variabler. Det tager altså ca. 1/2 minut at udføre Cipher.init på min 450'er,
så det gør man altså ikke flere gange.

Ulrik Magnusson


Soren Davidsen (17-05-2003)
Kommentar
Fra : Soren Davidsen


Dato : 17-05-03 08:07

Ulrik Magnusson <ulrikm@yahoo.com> writes:

> Soren Davidsen wrote:
>
> > Ulrik Magnusson <ulrikm@yahoo.com> writes:
> >
> > > Ulrik Magnusson wrote:
> > >
> > > > så fuskede jeg og gemte et AlgorithmParameters objekt fra krypteringen,
> > > > og så virkede det sørme:
> > >
> > > det bliver selvfølgelig lidt pænere, hvis man kan kalde dekrypteringsmetoden
> > > uden at skulle kalde krypteringsmetoden først:
> > >
> > [snip]
> >
> > .. men jeg ville personligt ikke vaere glad for et design der gemmer
> > statiske variable med ciphers, bedre med saa smaa scopes saa muligt..
>
> men uendeligt dyrt.. Jeg kan nu ikke se sikkerhedsbristen, da man alligevel
> kan generere de tilføjede variabler ud fra de allerede eksisterende public
> variabler. Det tager altså ca. 1/2 minut at udføre Cipher.init på min 450'er,
> så det gør man altså ikke flere gange.

Vel ikke uendeligt dyrt, men O(n) dyrt . Men du har ret i at jeg
heller ikke ville lave et design som Banzon's hvor noeglen er en
statisk variabel (og slet ikke en immutable statisk final streng).

Pointen er bare, sikkerhed er en underlig ting, man maa taenke paa
sine behov. F.eks. hvis banzon's lille kode-snippet skulle bruges
i en stor bank-loesning som koerer doegnet rundt, saa er man
nok ikke interesseret i at nogen kan dumpe hukommelsen for jvm'en
og finde master-kodeordet. Og, er det ikke mere end den lille
snippet, saa goer det nok ikke synderligt meget om man genbruger
cipher.

Jeg proevede ioevrigt lige mit eksempel paa en duron-1200, og der tog
cipher.init 103ms.


Mvh,

--
___
Soren Davidsen / o\
Deliver yesterday, code today, think tomorrow. (_____)
__ http://www.tanesha.net/ _________________________________(___)_______

Michael Banzon (17-05-2003)
Kommentar
Fra : Michael Banzon


Dato : 17-05-03 09:02

"Soren Davidsen" <soren200303@tanesha.net> skrev i en meddelelse
news:871xyyuk56.fsf@tanesha.net...
> Pointen er bare, sikkerhed er en underlig ting, man maa taenke paa
> sine behov. F.eks. hvis banzon's lille kode-snippet skulle bruges
> i en stor bank-loesning som koerer doegnet rundt, saa er man
> nok ikke interesseret i at nogen kan dumpe hukommelsen for jvm'en
> og finde master-kodeordet. Og, er det ikke mere end den lille
> snippet, saa goer det nok ikke synderligt meget om man genbruger
> cipher.

Det skal bruges til et lagersystem, hvor man ikke umiddelbart skal
have adgang til at rette i de data om lageret der er gemt på disken.
Men ja, jeg har overvejet at brugeren skulle indtaste et password,
som der så blev krypteret ud fra, i stedet for. Det bliver nok den
endelige løsning.

Det færdige system skal, i øvrigt, ikke være distribueret, ikke
bruges på mere end en enkelt maskine (aldrig andet) det _ikke_
har netværk/modem/etc., og det antages at hvis der vindes fysisk
adgang til maskinen, af en potentiel ondsindet bruger, så er
sikkerheden "non-present"

> Jeg proevede ioevrigt lige mit eksempel paa en duron-1200, og der tog
> cipher.init 103ms.

Ja, der er ikke nogen synlig ventetid her hos mig (Celeron 2GHz)

/ Michael



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408899
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste