21 Aralık 2022 Çarşamba

DigestInputStream Sınıfı

Giriş
Şu satırı dahil ederiz
import java.security.DigestInputStream;
constructor
Bir tane InputStream bir tane de MessageDigest nesnesi alır. read() metodlarından birisi kullanılarak InputStream nesnesi okunur ve okunan veri MessageDigest nesnesine geçilir.

read metodu
Örnek
Şöyle yaparız. Burada InputStream okunarak SHA-256 digest alınıyor. Ancak InputStream nesnesinin okuma belleği küçük kalabilir.
public static String calculateSha256Hex(Path jarPath) 
  throws IOException, NoSuchAlgorithmException {
  MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
  try (InputStream is = Files.newInputStream(jarPath);
    DigestInputStream dis = new DigestInputStream(is, messageDigest)) {

    while (dis.read() != -1) {
      messageDigest = dis.getMessageDigest();
   }
   return bytesToHex (messageDigest.digest());
}
read metodu - byte []
Kendi buffer nesnemizi kullanmak istersek şöyle yaparız
public static String calculateSha256Hex(Path jarPath) 
throws IOException, NoSuchAlgorithmException {
  MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
  try (InputStream is= Files.newInputStream(jarPath);
    DigestInputStream dis = new DigestInputStream(is, messageDigest)) {

    // 1 MB
    final int oneMB = 1024 * 1024;
    byte[] buffer = new byte[oneMB];
    while (true) {
      int readCount = digestInputStream.read(buffer);
      if (readCount < 0) {
        break;
      }
    }
  }
  return bytesToHex (messageDigest.digest());
}
Daha Sonra MessageDigest.digest() Metodu Çağrılır
Bu MessageDigest.digest() metodunu bir kere çağırmak lazım. İkinci kere çağrılınca farklı bir sonuç döner.

Hexadecimal String döndürmek için şöyle yaparız. Burada byte değeri 0xFF ile masklanıyor çünkü normalde Java'da byte tipi signed bir tip ve Integer'a çevrilirken de sign işareti korunuyor. 

Ama bize gereken unsigned byte değeri. Diyelim ki byte değeri -128 olsun. Bunu Integer yaparsak yine -128 elde ederiz ama hex değeri 0XFFFF_FF80 olur ama unsgined değeri aslında 0x80 idi. Bu hatayı yapmamak için 0xFF ile masklanır.
public static String bytesToHex(byte[] digest) {
  StringBuilder hexString = new StringBuilder(2 * digest.length);
  for (byte b : digest) {
    String hex = Integer.toHexString(0xff & b);
    if (hex.length() == 1) {
      hexString.append('0');
    }
    hexString.append(hex);
  }
  return hexString.toString();
}



Hiç yorum yok:

Yorum Gönder