30 Mayıs 2017 Salı

PBEKeySpec Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.security.spec.KeySpec;
import javax.crypto.spec.PBEKeySpec;
Açıklaması şöyle
In general cryptographic hashes such as MD5, SHA-1 or SHA-512 should not be used to directly hash a password. A password hash or PBKDF should be used. Examples are PBKDF2, bcrypt, scrypt and Argon2. These functions also take a salt and work factor to provide additional protection.
Cryptographic hash algoritmalarını direkt kullanmanın zararı ile ilgili bir diğer açıklama ise şöyle
The length of the password is limited by the length of the cypher() encryption algorithm. For instance, AES128 takes a 16-byte key. That means that your scheme couldn't accept passwords longer than 16 bytes, if we used AES128 encryption as cypher(). That's generally a bad idea -- artificial restrictions on the length of the password can only harm security.
Açıklaması şöyle. Bu sınıf AES gibi symmetric şifrelemelerde kullanılıyor.
Password hash algorithms have been invented for safe password hashing, also known as password based key derivation functions (PBKDF). The difference between a password hash and a PBKDF is mainly how the result is used: directly as a password hash to compare with a stored password hash or as symmetric key for input in a symmetric cipher or MAC algorithm.

Well known password hash algorithms are PBKDF2, bcrypt, scrypt and of course the already mentioned Argon2. The latter two also contain options for configuring memory hardness, to overcome hardware based attacks.
Bu sınıf altta SHA-1 kullanıyor. Açıklaması şöyle
The functions can often be configured using a hash function. For instance PBKDF2 requires a secure hash as configuration parameter, and it (kinda) defaults to SHA-1.
Kullanım
PBKDF2 (Password-Based Key Derivation Function 2) algoritmasını gerçekleştirir. Şöyle yaparız.
SecretKeyFactory f = SecretKeyFactory.getInstance("...");
byte[] key = f.generateSecret(spec).getEncoded();
constructor - password + salt + iterationCount
Şöyle yaparız.
byte[] salt = { ... };
String passPhrase = ...;
int iterationCount = 2;
KeySpec spec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
constructor - password + salt + iterationCount + keyLength
AES için şöyle yaparız.
PBEKeySpec spec = new PBEKeySpec("password", "salt".getBytes(),1000  , 128);

Covariant Return Type

Giriş
Covariant Return Type virtual bir metod A tipini döndürüyorsa, bu metodu yeniden gerçekleştiren bir alt sınıf A'dan kalıtan B tipini döndürebilir anlamına gelir.

Java Covariant Return Type özelliğini desktekler. Bu özelliklik Java 1.5 ile geldi.
Örnek
Doğru bir örnek şöyle
public class Parent{  
  public Object doSomething(){}  
 }  
 public class Child extends Parent{  
  public String doSomething() {}  
 }
Örnek
Hatalı bir örnek şöyle
public interface Exemplary
{
  CharSequence getText();
}

public class Example implements Exemplary
{
  @Override
  public String getText(); // legal
}

public class BadExample implements Exemplary
{
  @Override
  public Integer getText(); // error
}
Örnek
Arayüz için şöyle yaparız. Elimizde bir arayüz olsun.
public interface SuperInterface {

  SuperInterface getSomething();
}
Bu arayüzden kalıtan  ve farklı bir nesne dönen covariant arayüz için şöyle yaparız.
public interface SubInterface extends SuperInterface {

  SubInterface getSomething();
}



22 Mayıs 2017 Pazartesi

EntityManager Sınıfı

Giriş
Şu satırı dahil ederiz.
import javax.persistence.EntityManager;
Bu sınıfı EntityManagerFactory tarafından yaratılır. Açıklaması şöyle
In general you need a single Entity Manager per transaction. And this Entity Manager must not be used in two transactions at the same time.
Bu sınıf @PersistenceContext Anotasyonu tarafından inject edilebilir.

constructor
Şöyle yaparız.
EntityManagerFactory emf = ...;
EntityManager em = emf.createEntityManager();
close metodu
Şöyle yaparız.
em.close();
createNamedQuery metodu
JQL kullanan bir Query nesnesi döner. JQL cümlesine isim ile erişiriz. Şöyle yaparız.
Query q = em.createNamedQuery("Card.findPrefix");
createNativeQuery metodu
SQL kullanan bir Query nesnesi döner. Şöyle yaparız.
Query q = em.createNativeQuery("select count(*) from your_table_name")
createQuery metodu
JQL kullanan bir Query nesnesi döner. Şöyle yaparız.
Query q = em.createQuery("SELECT s FROM Status s WHERE s.statusName =:status");
Dışarından alınacak parametreler ":" karakteri ile başlayan değişkenlerle belirlenir. Bu değişkenlere değerleri setParameter() metodu ile atanır.

find metodu
Şöyle yaparız.
Foo foo = em.find(Foo.class, fooId);
find ve getReference farkı şöyle
// will return the persistent instance and never returns an uninitialized instance
em.find(Owner.class, id);

// might return a proxied instance that is initialized on-demand
em.getReference(Owner.class, id);
Benzer mantık Hibernate Session sınıfında da var.
// will return the persistent instance and never returns an uninitialized instance
session.get(Owner.class, id);

// might return a proxied instance that is initialized on-demand
session.load(Owner.class, id);
flush metodu
Şöyle yaparız.
em.flush();
getTransaction metodu
EntityTransaction nesnesi döner. Şöyle yaparız.
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();

em.persist(...);
em.persist(...);
em.persist(...);

em.getTransaction().commit();
joinTransaction metodu
Açıklaması şöyle
The purpose of entityManager.joinTransaction(); is to notify the persistence context to synchronize itself with the current transaction.
Şöyle yaparız.
em.joinTransaction();
merge metodu
OneToMany ilişikilerde CascadeType = MERGE ise yeni bir child eklenirse, yeni nesneyi kaydeder ve sonuç olarak döner.
Copy the state of the given object onto the persistent object with the same identifier. If there is no persistent instance currently associated with the session, it will be loaded. Return the persistent instance. If the given instance is unsaved, save a copy of and return it as a newly persistent instance. The given instance does not become associated with the session. This operation cascades to associated instances if the association is mapped withcascade="merge".
persist metodu
@Entity olarak işaretli bir nesnesi veritabanına kaydeder. Şöyle yaparız.
em.getTransaction().begin();
  Foo foo = new  Foo(...);
  em.persist(k);
em.getTransaction().commit();
unwrap metodu
Ne işe yaradığını anlamadım. Şu satırı dahil ederiz.
import org.hibernate.Session;
Şöyle yaparız.
Session session = em.unwrap(Session.class);



@PersistenceContex Anotasyonu

unitName
Elimizde şöyle bir XML olsun.
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
  version="2.0">
  <persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <properties>
      <property name="javax.persistence.jdbc.driver"
        value="com.mysql.jdbc.Driver"/>
      <property name="javax.persistence.jdbc.user" value="root"/>
      <property name="javax.persistence.jdbc.password" value="mypassword"/>
      <property name="javax.persistence.jdbc.url"
         value="jdbc:mysql://localhost/ptbrowserdb"/>
      <property name="hibernate.dialect"
        value="org.hibernate.dialect.MySQLDialect"/>
  </properties>
  </persistence-unit>
</persistence>
Şöyle yaparız.
@PersistenceContext(unitName = "manager1")
private EntityManager entityManager;