# Propertyfile verschlüsseln



## BetaRR400 (10. Juni 2008)

Hallo,

vielleicht könnt ihr mir ja weiterhelfen?!

also ich habe ein Java Programm, das am anfang ein textfile mit verschiedenen einstellungen ausliest (property file).

Beispiel:

property file:

width= 800;
height= 600;

java datei:

width= prob.getProperty("width");
...

-----------------------------------------------------------------

Jetzt würde ich aber gern das textfile mit einem password verschlüsseln, so das nicht jeder die Einstellungen verändern kann! Hat da mir irgend wer nen Vorschlag?

Danke


----------



## _jsd_ (10. Juni 2008)

Hi,

ich hatte mal eine ähnlich Problemstellung, folgender Code sollte dein Problem lösen...


```
package de.jsd.tools.properties;

import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

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

public class CryptProperties extends Properties
{

	private static final long serialVersionUID = 6221146452471126627L;

	public enum Mode { ENCYPT, DECYPT};
	
	private final String 									m_CryptString;
	
	public CryptProperties( String key)
	{
		
		this( key, new Properties());
				
	}
	
	public CryptProperties( String key, Properties properties)
	{
		
		super();
		
		Enumeration<Object> _keys = properties.keys();
		
		while( _keys.hasMoreElements())
		{
			
			String _key = _keys.nextElement().toString();
			
			this.setProperty( _key, properties.getProperty( _key));
					
		}
		
		this.m_CryptString = key;
		
	}
	
	public CryptProperties( String key, String cryptString)throws IOException, ManipulationException
	{
		
		this( key);
		
		if( null!=cryptString)
		{
			
			try
			{
						
				String[] _decypted = this._crypt( this.m_CryptString, cryptString, Mode.DECYPT).split( "&");
				
				for( int i=0; i<_decypted.length; i++)
				{
					
					String[] _tmp = _decypted[ i].split( "=");
					
					this.setProperty( _tmp[ 0], _tmp[ 1]);
					
				}
							
			}
			catch( ArrayIndexOutOfBoundsException aiobExc)
			{
				throw new ManipulationException();
			}
			
		}
		
	}
	
	/**
	 * Gibt die enthaltenen Properties als Verschl?sselten String zur?ck
	 */
	public String toString()
	{
		
		StringBuffer _cryptBuffer = new StringBuffer();
		
		Enumeration<Object> _keys = this.keys();
				
		while( _keys.hasMoreElements())
		{
			
			String _key = _keys.nextElement().toString();
			
			_cryptBuffer.append( ( ( 0!=_cryptBuffer.length())?"&":"")+_key+"="+this.getProperty( _key));
						
		}
		
		String _retval = null;
		
		try
		{
			_retval = this._crypt( this.m_CryptString, _cryptBuffer.toString().trim(), Mode.ENCYPT);
		}
		catch( IOException exc)
		{
			exc.printStackTrace();
		}
		
		return _retval;
		
	}

	private String _crypt( String key, String crypt, Mode mode)throws IOException
	{
		
		if( null!=crypt)
		{
			
			byte[] 	_crypt 	= ( mode.equals( Mode.DECYPT))?( new BASE64Decoder().decodeBuffer( crypt)):crypt.getBytes(),
					_key	= key.getBytes();
			
			
			
			for( int i=0, kyPos = 0; i<_crypt.length; i++, kyPos++)
			{
				
				if( _key.length==kyPos)
					kyPos = 0;
				
				_crypt[ i] = ( byte)( _crypt[ i]^_key[ kyPos]);
				
			}
			
			return ( mode.equals( Mode.ENCYPT))?new BASE64Encoder().encode( _crypt).replaceAll( "\r\n", ""):new String( _crypt);
			
		}
		
		return null;
		
	}
	
	public static String encode( String key, String name, String value)
	{
		
		Properties properties = new Properties();
		
		properties.put( name, value);
		
		return encode( key, properties);
		
	}
	
	public static String encode( String key, String props)
	{
		
		Properties properties = new Properties();
		
		Matcher matcher = Pattern.compile( "([a-zA-Z0-9]*)=([a-zA-Z0-9]*)").matcher( props);
		
		while( matcher.find())
			properties.put( matcher.group( 1), matcher.group( 2));
		
		return encode( key, properties);
		
	}
	
	public static String encode( String key, Properties args)
	{
		
		return new CryptProperties( key, args).toString();
		
	}
	
	public static Properties decode( String key, String crpt)
	{
		
		try
		{
			return new CryptProperties( key, crpt);
		}
		catch ( Exception e)
		{
			return null;
		}
	}
	
	public class ManipulationException extends Exception
	{
		
		private static final long serialVersionUID = -5897201936298811861L;

		private ManipulationException()
		{
			super( "parameters seems to be manipulated");
		}
		
	}

}
```

Kannst die Properties genauso verwenden wie die "normalen"...brauchst nur ein Schlüssel mit angeben und der rest wird von selbst erledigt.


----------



## JavaCoder23 (5. August 2009)

Hat jemand die CrpytProperties mal mit vielen Einstellungen getestet?

Den verschlüsselten String den ich raus bekomme und in einem .properties-file speichere ist 16 Zeilen lang.

Wenn ich ihn wieder einlese bekomme ich die 
CryptProperties$ManipulationException: parameters seems to be manipulated
obwohl der eingelesene String genau der gleiche ist den CryptProperties.toString(); ausgegeben hat! (equals der beiden strings ergibt true)

Für eine einzige Einstellung, die dann nacher einen einzeiligen String ergibt, hab ich es wiederrum erfolgreich auf die selbe Weise getestet.

Als Hinweis steht dort das man die CryptProperties genau so benutzen kann wie die Properties.... allerdings bekomm ich mit store() ja keine verschlüsselte Datei!!

Was mach ich falsch?


----------



## _jsd_ (5. August 2009)

Hi,

hast Du mal geschaut was die wirkliche Exeption ist? Stacktrace?
Wenn Du noch die store() benötigst, dann mußt Du diese nur noch überschreiben. Sprich beim store() einfach die Verschlüsselung an werfen und dann in die gewünschte Datei schreiben....

Grüße


----------



## Thomas Darimont (5. August 2009)

Hallo,

andere Alternative:
http://www.jasypt.org/encrypting-configuration.html

Gruß Tom


----------

