학습 내용 (8/21)

Welcome to Seoyun Dev Log·2023년 8월 21일
0

[WORK] 학습내용

목록 보기
20/25
  • Element.getObjectValue()
    : Ehcache라는 Java 기반의 오픈 소스 캐싱 프레임워크에서 사용되는 메서드
    Ehcache에서는 Element 객체를 통해 캐시된 데이터에 접근하고 관리합니다.
    getObjectValue() 메서드를 호출하여 실제 데이터 값을 얻을 수 있습니다
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

public class Example {
    public static void main(String[] args) {
        // 캐시 매니저 생성
        CacheManager cacheManager = CacheManager.getInstance();

        // "myCache"라는 이름의 캐시 가져오기
        Cache cache = cacheManager.getCache("myCache");

        // "myKey"라는 키로 캐시에 Element 추가
        Element element = new Element("myKey", "myValue");
        cache.put(element);

        // Element에서 값 가져오기
        Element retrievedElement = cache.get("myKey");
        if (retrievedElement != null) {
            Object value = retrievedElement.getObjectValue();
            System.out.println("Retrieved value: " + value);
        }

        // 캐시 매니저 종료
        cacheManager.shutdown();
    }
}
  • cipher.doFinal()
    : 암호화, 복호화를 하고 그 데이터를 반환
    메서드는 바이트 배열 형태로 입력 데이터를 받아 처리하고, 처리된 결과를 바이트 배열로 반환

    • doFinal() 메서드의 호출은 다음과 같은 절차를 따릅니다
  1. Cipher 객체를 초기화하고 암호화나 복호화 모드를 설정합니다.
  2. doFinal() 메서드를 호출하면서 암호화나 복호화할 데이터를 전달합니다.
  3. 메서드는 암호화나 복호화 작업을 수행하고, 결과를 바이트 배열로 반환합니다.

예제)

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

public class CipherExample {
    public static void main(String[] args) throws Exception {
        String data = "Hello, encryption!";
        
        // 비밀 키 생성
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128); // 128-bit key
        SecretKey secretKey = keyGenerator.generateKey();

        // Cipher 객체 초기화 및 암호화 모드 설정
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        // 데이터 암호화
        byte[] encryptedData = cipher.doFinal(data.getBytes());

        // 암호화된 데이터 출력
        System.out.println("Encrypted data: " + new String(encryptedData));

        // 복호화를 위해 Cipher 객체 초기화 및 복호화 모드 설정
        cipher.init(Cipher.DECRYPT_MODE, secretKey);

        // 데이터 복호화
        byte[] decryptedData = cipher.doFinal(encryptedData);

        // 복호화된 데이터 출력
        System.out.println("Decrypted data: " + new String(decryptedData));
    }
}

  • new String(byte bytes[], Charset charset)
    : 바이트 배열을 특정 문자(charset)을 사용하여 문자여롤 변환하는 역할

java에서 문자열은 기본적으로 unicode 문자를 다루지만 네트워크 통신이나 파일 입출력 등에서는 데이터가 바이트 배열로 처리될 수 있다.
이때 문자열로 바이트 배열을 변환하거나 반대로 바이트 배열을 문자열로 변환해야할 때 해당 생성자를 사용한다.

import java.nio.charset.StandardCharsets;

public class StringConversionExample {
    public static void main(String[] args) {
        byte[] byteArray = {72, 101, 108, 108, 111}; // "Hello" in ASCII values

        String convertedString = new String(byteArray, StandardCharsets.UTF_8);

        System.out.println("Converted String: " + convertedString);
    }
}

  • Collections.unmodifiableMap()
    : 정적 메서드이면서 가변적인 map을 수정할 수 없는 불변적인(immutable) 맵으로 래핑(감싸는)하는 역할을 합니다. 불변적인 맵은 변경이 불가능하므로, 읽기 전용 데이터 구조를 생성하고자 할 때 유용하게 사용하고
    불변적인 데이터 구조를 사용하면 데이터의 안정성과 무결성을 보장할 수 있습니다. 다중 스레드 환경에서도 안전하게 사용될 수 있으며, 의도하지 않은 변경이나 부작용을 방지

  • .openSession(false)
    : SqlSessionFactory.openSession(false)는 MyBatis 프레임워크에서 사용되는 메서드 호출입니다. MyBatis는 데이터베이스와의 상호작용을 쉽게 만들어주는 자바 ORM(Object-Relational Mapping) 프레임워크입니다.

SqlSessionFactory는 MyBatis의 핵심 클래스 중 하나로, 데이터베이스와의 연결을 설정하고 관리하는 역할을 합니다. openSession() 메서드를 호출하여 데이터베이스 세션을 열 수 있습니다. 여기서 openSession(false) 메서드 호출은 트랜잭션을 자동으로 시작하지 않는 비트랜잭션 모드로 세션을 열겠다는 것을 나타냅니다.

일반적으로 openSession(false)를 호출하면 다음과 같은 일이 수행됩니다:

데이터베이스와의 연결을 설정하고 세션을 엽니다.
이 세션은 비트랜잭션 모드로 열리므로, 수동으로 트랜잭션을 관리해야 합니다. 즉, 개발자가 명시적으로 트랜잭션을 시작하고 커밋 또는 롤백을 수행해야 합니다.
이렇게 열린 세션은 자동 커밋을 하지 않기 때문에 개발자가 트랜잭션 작업을 완료하기 전까지는 변경 내용이 데이터베이스에 반영되지 않습니다.


  • sqlSession.getMapper()
    매퍼 인터페이스의 구현체 얻기 (매퍼 인터페이스는 SQL 쿼리를 정의하고 실행하는 역할을 합니다.)

  • salt
    사용자별로 고유한 "salt"를 생성하고 비밀번호와 결합하여 해시 함수를 실행합니다. 이렇게 함으로써 동일한 비밀번호를 사용하는 사용자라도 다른 해시 값이 생성되므로 레인보우 테이블 공격을 어렵게 만듭니다.

일반적으로 "salt"는 해시 값을 생성할 때 사용자마다 다르게 생성되며, 랜덤한 값을 가지도록 설계됩니다. "salt"는 해시 값과 함께 저장되어 나중에 비밀번호를 검증할 때 사용되며, 보안성을 높이는 중요한 역할을 합니다.


  • MessageDigest.class
    MessageDigest 클래스는 Java에서 해시 함수를 사용하여 데이터를 해시하는 기능을 제공하는 클래스입니다. 해시 함수는 임의의 길이의 데이터를 입력으로 받아 고정된 길이의 해시 값(디지털 지문)을 출력으로 생성하는 함수입니다. 주로 비밀번호 저장, 메시지 무결성 검사 등에 사용됩니다.

MessageDigest 클래스는 Java의 java.security 패키지에 속해 있습니다. 주로 아래와 같은 기능을 수행

  1. 해시 함수 선택 및 초기화: MessageDigest.getInstance("알고리즘명") 메서드를 사용하여 원하는 해시 알고리즘을 선택하고 초기화할 수 있습니다. 대표적으로 "MD5", "SHA-1", "SHA-256" 등이 있습니다.

  2. 데이터 업데이트: update(byte[] input) 메서드를 사용하여 해시할 데이터를 한 번에 조각조각 업데이트할 수 있습니다. 이를 통해 큰 데이터를 처리할 수 있습니다.

  3. 해시 계산: digest() 메서드를 호출하여 최종 해시 값을 계산하고 반환합니다.

  • digest()
    입력 데이터의 해시 값을 계산하여 바이트 배열로 반환합니다. 이 메서드를 사용하여 해시 함수를 적용한 결과를 얻을 수 있습니다.

    MessageDigest.digest() 메서드를 호출하여 SHA-256 해시 함수를 적용한 결과를 얻습니다. 해시 값은 바이트 배열로 반환되며, 이를 16진수로 변환하여 출력합니다.

MessageDigest.digest() 메서드는 한 번 호출하면 이후에 더 이상 update() 메서드로 데이터를 추가할 수 없습니다. 따라서 해시 계산을 완료한 후에는 새로운 데이터를 추가하거나 다시 계산하려면 MessageDigest 객체를 다시 초기화해야 합니다.

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MessageDigestExample {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        String inputData = "Hello, MessageDigest!";
        
        // SHA-256 해시 함수로 MessageDigest 초기화
        MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
        
        // 데이터 업데이트
        messageDigest.update(inputData.getBytes());
        
        // 해시 계산
        byte[] hashBytes = messageDigest.digest();
        
        // 해시 값을 16진수로 표현
        StringBuilder hashHex = new StringBuilder();
        for (byte b : hashBytes) {
            hashHex.append(String.format("%02x", b));
        }
        
        System.out.println("Input Data: " + inputData);
        System.out.println("Hash: " + hashHex.toString());
    }
}

  • Hex.encodeHexString()
    Apache Commons Codec 라이브러리에서 제공되는 메서드로, 바이트 배열을 16진수로 인코딩된 문자열로 변환하는 기능을 수행합니다. 이를 통해 해시 값이나 바이너리 데이터를 텍스트 형태로 표현할 수 있습니다.
  • 바이트 배열을 16진수로 인코딩된 문자열로 변환하는 이유는 주로 다음과 같습니다:

가독성: 16진수는 0부터 15까지의 숫자와 A부터 F까지의 문자로 표현되므로, 보다 직관적이고 가독성이 높은 방식으로 바이너리 데이터를 표현할 수 있습니다. 이는 특히 바이너리 데이터를 직접 읽거나 전송하는 경우에 유용합니다.

텍스트 표현: 16진수로 인코딩된 문자열은 텍스트로 처리되므로, 문자열 형태로 저장하고 전송할 수 있습니다. 이는 바이너리 데이터를 텍스트 기반의 시스템에서 다룰 때 유용합니다.

해시 값 표현: 해시 함수는 일반적으로 바이트 배열 형태로 결과를 반환합니다. 이 결과를 16진수로 인코딩하면 보다 간편하게 비교하거나 표현할 수 있습니다. 예를 들어, 파일 무결성을 검증하는 경우 파일의 해시 값을 16진수로 표현하여 사용할 수 있습니다.

디버깅 및 분석: 프로그램의 디버깅이나 데이터 분석 작업 시 바이너리 데이터를 16진수로 표현된 문자열로 변환하면 데이터의 구조와 내용을 더 쉽게 파악할 수 있습니다.

다양한 용도: 16진수로 인코딩된 문자열은 암호화, 해시 함수, 파일 포맷, 네트워크 프로토콜 등 다양한 용도에서 활용됩니다. 바이너리 데이터를 문자열로 표현하면 데이터 처리 및 교환 작업이 편리해집니다.

결론적으로, 바이트 배열을 16진수로 인코딩된 문자열로 변환하는 이유는 데이터를 보다 쉽게 다루고 표현하기 위함입니다. 이러한 표현은 가독성, 텍스트 기반 시스템과의 호환성, 해시 값 표현 등에서 이점을 제공합니다.


  • DateUtils.addDays( lastChangedDate, passwordPeriod -1 );
    현재 날짜를 기준으로 하기 위해서
profile
하루 일지 보단 행동 고찰 과정에 대한 개발 블로그

0개의 댓글