Security
<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 sifreBu 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 MachineBu 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.
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.
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.