Sicherheitscode generieren

mtk-flo

Erfahrenes Mitglied
Hallo,

Ich möchte ein eigenes Sicherheitssystem programmieren.

Ich möchte anhand eines Schlüssels einen Code generieren.
Der Code sollte sich möglichs nie wiederholen...

Jedoch will ich über den Schlüssel den Code prüfen können.

Ist sowas möglich !?
Wie ist da die Programmier-Logik ?!
 
Hi,

ist in Java alles eingebaut. Keystores, Keygeneratoren, Sicherheitszertifikate können erzeugt und geprüft werden. Datenströme kannst Du verschlüsseln. Dazu kannst Du mit dem Progamm Keygen, das mit Java mitgeliefert wird, die Schlüsselpaare erzeugen.

Oder so:
Java:
try {
        // Generate a 1024-bit Digital Signature Algorithm (DSA) key pair
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
        keyGen.initialize(1024);
        KeyPair keypair = keyGen.genKeyPair();
        PrivateKey privateKey = keypair.getPrivate();
        PublicKey publicKey = keypair.getPublic();
    
        // Generate a 576-bit DH key pair
        keyGen = KeyPairGenerator.getInstance("DH");
        keyGen.initialize(576);
        keypair = keyGen.genKeyPair();
        privateKey = keypair.getPrivate();
        publicKey = keypair.getPublic();
    
        // Generate a 1024-bit RSA key pair
        keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(1024);
        keypair = keyGen.genKeyPair();
        privateKey = keypair.getPrivate();
        publicKey = keypair.getPublic();
    } catch (java.security.NoSuchAlgorithmException e) {
    }

Du schreibst:
Jedoch will ich über den Schlüssel den Code prüfen können.

Wenn Du damit meinst, dass Du JARfiles signieren willst, dann geht das mit Keygen. Damit kannst Du ein Zertifikat erstellen, und den Javacode damit schützen. Das Verfahren kann ich aber nicht in 5 Minuten erklären.

Ich verstehe nicht was Du genau brauchst, aber schau mal hier.

http://java.sun.com/j2se/1.4.2/docs/guide/security/CryptoSpec.html und hier http://www.exampledepot.com/egs/java.security/pkg.html?l=rel#Key Store

oder einfach mal nach Security oder Crypto und Java googlen.

Muss leider Arbeiten gehen, sonst würde ich ein Beispiel einstellen.
 
Zuletzt bearbeitet:
Also möglich ist das was du suchst auf jeden Fall. Aber wie es genau funktioniert, kann ich dir auch nicht erklären.

Wenn man im Internet Verzeichnisse schützen will, funktioniert das, indem man in das entsprechende Verzeichnis eine .htaccess-Datei und eine .passwd-Datei hinterlegt. In dieser Datei sind Benutzernamen und Passwörter abgelegt. Die Passwörter sind verschlüsselt - das tolle ist, dass identische Passwörter niemals gleich aussehen. Trotzdem kann natürlich kontrolliert werden ob das eingegebene Passwort richtig ist. Ich vermute das funktioniert dann über den Hash-Wert davon.

Wie gesagt, wie es funktioniert weiß ich auch nicht. Wollte dir damit jetzt nur einen Hinweis darauf geben, nach welchem Algorithmus du mal im Netz suchen kannst. Vielleicht ist er ja auch schon bei dem bei, was limago empfohlen hat :)
 
Im Prinzip möchte ich aus einem speziellen Wort (z.B.: "Fotoaperat") ein hash bilden, der sich aber kaum wiederholt....

geb ich den Hash-Wert in mein Programm ein, soll das Wort "Fotoaperat" erscheinen...
Somit will ich dir Gültigkeit prüfen....
 
Ich weiß ja nicht wie die Werte generiert werden sollen oder wie das alles funktionieren soll, aber bei dem was ich im moment weiß, würde ich sagen, dass es es doch einfach mit Verschlüsselung machen kannst.

Wenn du den String verschlüsselst, ist er nachher nicht mehr lesbar und wenn du ihn entschlüsselst, ist er wieder lesbar.

Aber ich verstehe nicht so ganz was du machen willst. Warum sollte jetzt um bei dem Hash-Beispiel zu bleiben jemand ein Hashwert eingeben?
Eigentlich gibt man doch das richtige Wort ein, errechnet daraus den Hashwert und vergleicht diesen mit dem abgespeicherten Hashwert.

MFG

zEriX
 
Habe gerade keine Zeit, nur so viel dazu: Man kann aus dem Hashcode des Objects und dem privaten schlüssel eine Signatur erzeugen. Diese Signatur kann mit dem öffentlichen Schlüssel verifiziert werden.

Dazu braucht man "Zertifikate". Diese werden mit "keygen" erzeugt und in einem "keystore" abgelegt.

google doch mal zu diesen Begriffen.... Code folgt, wenn ich Zeit habe.

Gruss
 
Mit Hilfe der Klasse MessageDigest kannst Du einen Hash zu dem String erzeugen:

Java:
package de.tutorials;

import java.security.MessageDigest;

public class DigestDemo {

	
	public static void main(String[] args) throws Exception {
			MessageDigest messageDigest =
			MessageDigest.getInstance("SHA-256");
			String stext ="Dieser Text soll einen Hash bekommen" ;
			messageDigest.update( stext.getBytes("UTF8") );
			byte [] hashwert = messageDigest.digest();
			
	}

}

So erzeugst Du eine Signatur aus einem String mit dem privaten Schlüssel und verifizierst mit öffentlichem Schlüssel. Dies ist ein simples Beispiel. Besser ist es mit Keystore und Zertifikaten zu arbeiten....

Java:
package de.tutorials;

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;

public class Schluessel {

	private PublicKey publicKey;

	private PrivateKey privateKey;

	public Schluessel() throws Exception {

		KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
		keyPairGenerator.initialize(512);
		KeyPair keyPair = keyPairGenerator.generateKeyPair();
		publicKey = keyPair.getPublic();
		privateKey = keyPair.getPrivate();
	}

	public byte[] createSignature(String meinText) throws Exception {
		Signature signature = Signature.getInstance("MD5WithRSA");
		signature.initSign(privateKey);
		signature.update(meinText.getBytes("UTF8"));
		return signature.sign();
	}

	public boolean verify(String meinText, byte[] signatur) throws Exception {
		Signature sig = Signature.getInstance("MD5WithRSA");
		sig.initVerify(publicKey);
		sig.update(meinText.getBytes("UTF8"));
		return sig.verify(signatur);
	}

	private void run() {
		try {
			String textZumSignieren = "Dieser Text darf nicht verändert werden";
			// Signatur erstellen;
			byte[] mySignature = createSignature(textZumSignieren);
			
			if (verify(textZumSignieren, mySignature))
				System.out.println("Text ist unverändert!");
			else
				System.out.println("ACHTUNG: Text wurde verändert!");

			
			textZumSignieren = "neuer Text!";
			if (verify(textZumSignieren, mySignature))
				System.out.println("Text ist unverändert!");
			else
				System.out.println("ACHTUNG: Text wurde verändert!");

		} catch (Exception e) {

			e.printStackTrace();
		}
	}

	public static void main(String[] args) throws Exception {

		new Schluessel().run();
	}

}
 
Während man mit dem privaten schlüssel die Signatur erstellt und sie mit dem öffentlichen schlüssel prüft, Kann man mit dem öffentlichen Schlüssel verschlüsseln und mit dem privaten entschlüsseln....

Java:
package de.tutorials;

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.Provider;
import java.security.PublicKey;
import java.security.Security;
import java.security.Signature;

import javax.crypto.Cipher;

public class Schluessel {

	private PublicKey publicKey;

	private PrivateKey privateKey;

	public Schluessel() throws Exception {

		//Security.addProvider(new java.security.AuthProvider());

		KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
		keyPairGenerator.initialize(512);
		KeyPair keyPair = keyPairGenerator.generateKeyPair();
		publicKey = keyPair.getPublic();
		privateKey = keyPair.getPrivate();
	}

	public byte[] encrypt(String text) throws Exception {

		Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		byte[] cipherText = cipher.doFinal(text.getBytes());
		return cipherText;
	}

	public String decrypt(byte [] geheimerText) throws Exception{
		Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		return new String( cipher.doFinal(geheimerText));
		
	}

	private void run() {
		try {
			String textZumVerschluesseln = "Dieser Text ist geheim!";
			byte [] geheim = encrypt(textZumVerschluesseln);
			System.out.println(new String(geheim));
			
			String klarText = decrypt(geheim);
			
			System.out.println(klarText);
			
			

		} catch (Exception e) {

			e.printStackTrace();
		}
		/*
		Provider [] providers = Security.getProviders();
		for (int i = 0; i < providers.length; i++) {
			System.out.println(providers[i].getName());
		}
		*/
	}

	public static void main(String[] args) throws Exception {

		new Schluessel().run();
	}

}

gruss
 
Zurück