반응형

CRC32

설명

  • CRC(cyclic redundancy check)는 데이터 전송시 오류가 있는지 확인하는 체크값 계산을 위해 주로 사용한다.
  • CRC는 구현하기 쉽고, 데이터 오류 검출하는데 탁월하다.
  • 의도적으로 주어진 CRC 값을 갖는 다른 데이터를 만들기 쉬워 데이터 무결성 검사에서는 사용될 수 없다. (무결성 검사시 MD5 사용)
  • 암호화 목적이 아니므로 다른 해시 알고리즘보다 속도가 비교적 빠르다는 특징을 갖고 있다.

코드

public class Crc32Test {
    @Test
    public void testCrc32() {
        assertEquals(1243066710, crc32("Hello World"));
    }

    private long crc32(String value) {
        CRC32 crc32 = new CRC32();
        crc32.update(value.getBytes());
        return crc32.getValue();
    }
}

MD5

설명

  • MD5(Message-Digest algorithm 5)는 128비트 암호화 해시 함수이다.
  • 단방향 해시 알고리즘(one-way-hash algorithm) 중에 하나이다.
  • 단방향 해시 알고리즘은 원래 값을 알아내기(복호화가) 어렵기 때문에 암호화, 보안 영역에서 사용되어야 하는데, 1996년에 MD5의 설계상 결함이 발견되어 암호화, 보안 영역에서는 다른 알고리즘을 사용할 것을 권장한다.
  • 따라서 주로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사 등에 사용된다.

코드

public class Md5Test {
    @Test
    public void testMd5() {
        assertEquals("b10a8db164e0754105b7a99be72e3fe5", md5("Hello World"));
    }

    public String md5(String value) {
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            md5.update(value.getBytes(StandardCharsets.UTF_8));

            // 바이트배열을 16진수 문자열로 변환하여 표시
            StringBuilder hexMD5hash = new StringBuilder();
            for (byte b : md5.digest()) {
                String hexString = String.format("%02x", b);
                hexMD5hash.append(hexString);
            }

            return hexMD5hash.toString();
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
    }
}

SHA-256

설명

  • SHA-256은 SHA(Secure Hash Algorithm) 알고리즘의 한 종류로서 256비트로 구성되며 64자리 문자열을 반환한다.
  • 블록체인 영역에서 많이 채택하여 사용중인 암호화 알고리즘이다.
  • MD5에 비해 비교적 안전하다.

코드

public class Sha256Test {
    @Test
    public void testSha256() {
        assertEquals("a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e", sha256("Hello World"));
    }

    public String sha256(String value) {
        try {
            MessageDigest md5 = MessageDigest.getInstance("SHA-256");
            md5.update(value.getBytes(StandardCharsets.UTF_8));

            // 바이트배열을 16진수 문자열로 변환하여 표시
            StringBuilder hexMD5hash = new StringBuilder();
            for (byte b : md5.digest()) {
                String hexString = String.format("%02x", b);
                hexMD5hash.append(hexString);
            }

            return hexMD5hash.toString();
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
    }
}

참고

반응형

'Development > Java' 카테고리의 다른 글

[Java] JUnit5  (0) 2021.12.08
[Java] JUnit4  (0) 2021.11.23
[Java] Stream  (0) 2021.09.09
[Java] Shell Command 실행하기  (0) 2021.08.28
[Java] Date  (0) 2021.07.24

+ Recent posts