Passwort verschlüsseln schlägt fehl

unavailable

Mitglied
Guten Tag,

ich arbeite zur Zeit an einem Adressbuch.
Ich möchte, dass die Passwörter, bevor sie in die Datenbank eingetragen werden, verschlüsselt werden.
Hierfür benutze ich diese Klasse:
Java:
import java.security.Key;
import java.util.Arrays;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class CEncryption
{
	static Key key;
	static Cipher cipher;
	private final static String algorithm = "AES";
	private final static byte[] keyValue = { 'T', 'h', 'e', 'B', 'e', 's', 't', 'E', 'n', 'c', 'r', 'y', 'p', 't', 'i', 'o', 'n' };

	public static String encrypt(String toEncrypt) throws Exception
	{
		key = generateKey();
		cipher = Cipher.getInstance(algorithm);
		cipher.init(Cipher.ENCRYPT_MODE, key);
		byte[] b = cipher.doFinal(toEncrypt.getBytes());
		return new BASE64Encoder().encode(b);
	}
	
	public static String decrypt(String encryptedString) throws Exception
	{
		key = generateKey();
		cipher = Cipher.getInstance(algorithm);
		cipher.init(Cipher.DECRYPT_MODE, key);
		byte[] temp = new BASE64Decoder().decodeBuffer(encryptedString);
		byte[] b = cipher.doFinal(temp);
		return new String(b);
	}

	private static Key generateKey() throws Exception
	{
		return new SecretKeySpec(Arrays.copyOf(keyValue, 16), algorithm);
	}

}

Hier rufe ich die Funktion auf:
Java:
	public void registerUser(String username, String password) throws Exception
	{	
		CEncryption.encrypt(password);
		try
		{
			statement = connection.createStatement();
			String sql = "INSERT INTO users(username, password) VALUES("+"'"+username+"'"+"," +"'"+password+"'"+")";
			statement.executeQuery(sql);
		}
		catch (SQLException e)
		{
			e.getMessage();
		}
	}

Allerdings will das nicht richtig funktionieren, denn nach dem Registrieren steht das Passwort in Klartext in der Datenbank. Ich kriege keinerlei Exceptions von Eclipse, was mich zu dem Punkt bringt hier zu posten. Irgendwelche Anregungen/Tips/Verbesserungsvorschläge?
 
Java:
	public void registerUser(String username, String password) throws Exception
	{	
		CEncryption.encrypt(password);
		try
		{
			statement = connection.createStatement();
			String sql = "INSERT INTO users(username, password) VALUES("+"'"+username+"'"+"," +"'"+password+"'"+")";
			statement.executeQuery(sql);
		}
		catch (SQLException e)
		{
			e.getMessage();
		}
	}

Warum erwartest du auch etwas anderes?
Du rufst zwar die Methode encrypt auf, aber mit dem Rückgabewert (verschlüsseltes Password) machst du nichts! Speichere den Rückgabewert in eine lokale Variable und verwende diese statt "password" im Query.

Anmerkung: Dein Code ist anfällig für SQL Injection, verwendet stattdessen PreparedStatements!
 
Wenn du das Passwort schon verschlüsselt, solltest du halt auch das verschlüsselte Passwort in die Datenbank schreiben und nicht den Klartext:


Java:
String encryptedPassword = CEncryption.encrypt(password);
 
Warum erwartest du auch etwas anderes?
Du rufst zwar die Methode encrypt auf, aber mit dem Rückgabewert (verschlüsseltes Password) machst du nichts! Speichere den Rückgabewert in eine lokale Variable und verwende diese statt "password" im Query.

Anmerkung: Dein Code ist anfällig für SQL Injection, verwendet stattdessen PreparedStatements!
Höhö, sowas fällt mir natürlich nicht auf.
Danke für den Tip mit sqli, werd mich dran machen 🙂.

Dankeschööööööön.

Wenn du das Passwort schon verschlüsselt, solltest du halt auch das verschlüsselte Passwort in die Datenbank schreiben und nicht den Klartext:


Java:
String encryptedPassword = CEncryption.encrypt(password);
Genau so wird's gemacht, danke euch.
 

Zurück
Oben