Bu Sayfayı Paylaş:

Kavram

java.security

Tanım: JSE (Java Standart Edition) platformunda security ile ilgili sınıfların ve interface'lerin bulunduğu paket

Kavram

MessageDigest

Tanım: Java security paketinde bulunan , MD5 , SHA-1, SHA-256 algoritmalarını destekleyen, bir ifadeyi hashleyen (message digest işlemi) methodları içeren sınıf. İstenilen boyutta bir veriden, sabit uzunluklu bir veri üretir

Örnek

Bir String'i MessageDigest İle Hashleyen Örnek

Aşağıdaki sınıf verilen bir ifadeyi message digest (hash) işleminden geçirmekte, Hex tipinde String olarak geri döndürmektedir:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class PasswordManager {

	public static String digest(String password) throws NoSuchAlgorithmException {

		MessageDigest md = MessageDigest.getInstance("MD5");
		md.update(password.getBytes());
		byte[] hash = md.digest();

		StringBuilder sb = new StringBuilder(hash.length * 2);
		for (byte b : hash) {
			sb.append(String.format("%02x", b & 0xff));
		}
		return sb.toString();
	}
	
	public static void main(String[] args) 
			throws NoSuchAlgorithmException {
		String hashed=PasswordManager.digest("fibiler12x");
		System.out.println("hashed:"+hashed);	
	}
}
Yukarıdaki kod bir şifrenin Hex karşılığını bulmak için kullanılabilir. Bir kullanıcı şifre girdiğinde, girilen şifre de aynı fonksiyondan geçirilir ve daha önce hahslenen değerler aynı olup olmadığı kontrol edilebilir.
Aynı örnek aşağıdaki gibi farklı bir şekilde de yapılabilir:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class PasswordManager {
	public static String digest(String password) throws NoSuchAlgorithmException {
		MessageDigest md = MessageDigest.getInstance("MD5");
		md.update(password.getBytes());
		byte[] hash = md.digest();
		StringBuffer hexString = new StringBuffer();
		for (int i = 0; i < hash.length; i++) {
			if ((0xff & hash[i]) < 0x10) {
				hexString.append("0" + Integer.toHexString((0xFF & hash[i])));
			} else {
				hexString.append(Integer.toHexString(0xFF & hash[i]));
			}
		}
		return hexString.toString();
	}
	
	public static void main(String[] args) 
			throws NoSuchAlgorithmException {
		String hex=PasswordManager.digest("abc!12x!");
		System.out.println("hex:"+hex);
	}
}
Bu örnekte sadece byte dizisinden Hex oluşturma kodu değişmiştir.

Veri

jasypt ile Bir Uygulamanın Konfigürasyonunda Bazı Değerlerin Şifrelenmesi

Bir uygulamanız olsun ve bu uygulama bir properties dosyasından veritabanı bilgilerini yüklesin. Veritabanın şifresinin bu dosyada açık bir şekilde olmasını istemeyebilirsiniz. Bunun için basit bir kütüphane olan jasypt kullanılabilir. Öncelikle Maven'e bağımlılığı ekleyelim:
<dependency>
	<groupId>org.jasyp</groupId>
	<artifactId>jasypt</artifactId>
	<version>1.9.3</version>
</dependency>
İlk iş veritabanın şifresini şifrelemek gerekir. Bunun için bir uygulama yapılabilir ve aşağıdaki gibi çalıştırılabilir:
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword("sifrelemek icin bir sifre"); 
encryptor.setAlgorithm("PBEWithHMACSHA512AndAES_256");
encryptor.setIvGenerator(new RandomIvGenerator());

String encryptedPassword = encryptor.encrypt("veritabani sifresi");
System.out.println(encryptedPassword);
Bu uygulamanın ürettiği şifre aşağıdaki gibi properties dosyasına eklenebilir :
javax.persistence.jdbc.username=dbusername
javax.persistence.jdbc.password=ENC(rv8w19IHwEMbwIC/fJF+DaQAUGasVNGBn4ySSLs5Li0cySa)
Şifrelenmiş şifre ENC( ile ) içine yerleştirilmelidir. Uygulama ilk açılırken konfigürasyon bilgilerini aşağıdaki gibi yükleyebilir ve şifreyi alabilir :
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword("sifrelemek icin bir sifre"); // bu uygulama acilirken vm argümanı olarak vb.. alinabilir
encryptor.setAlgorithm("PBEWithHMACSHA512AndAES_256");
encryptor.setIvGenerator(new RandomIvGenerator());

projectConfiguration = new EncryptableProperties(encryptor);

try(FileInputStream fis = new FileInputStream("path burada")){
	projectConfiguration.load(fis);
}catch (IOException e) {
	e.printStackTrace();
}

String username=projectConfiguration.get("javax.persistence.jdbc.username");
String password=projectConfiguration.get("javax.persistence.jdbc.password");
password değeri database şifresidir. Bu şekilde konfigürasyon dosyasında veritabanın şifresi açık olarak gözükmeyecektir. Sadece şifrelemek için kullanılan şifre kod içinde olacaktır. Sifrelemek icin gerekli olan şifre uygulama açılırken alınabilir. Bunun için örneğin aşağıdaki gibi VM argümanı olarak alınabilir:
-Dapplication.encryp.password=sifrelemek icin bir sifre
Bu değer aşağıdaki gibi uygulama açıldığı yerde konfigürasyonu okurken şifre aşağıdaki gibi set edilebilir:
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword(System.getProperty("application.encryp.password"));	
encryptor.setAlgorithm("PBEWithHMACSHA512AndAES_256");
encryptor.setIvGenerator(new RandomIvGenerator());
Bu StandardPBEStringEncryptor'ü kullandığınız uygulama aşağıdaki gibi bir hata verebilir:
org.jasypt.exceptions.EncryptionOperationNotPossibleException
  Encryption raised an exception. A possible cause is you are using strong encryption
  algorithms and you have not installed the Java Cryptography Extension (JCE) Unlimited
  Strength Jurisdiction Policy Files in this Java Virtual Machine
Bu hata kullanılan algoritmanın JVM de olmadığı anlamına gelmektedir. Bunun için PBEWithHMACSHA512AndAES_256 algoritması yerine PBEWithMD5AndDES kullanırsanız sorun çözülecektir.



Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir