정리사항 44 - 해시 값 생성 (String -> SHA-256 -> HEX String -> Base64)
*String -> SHA-256 -> HEX String -> Base64(문자열 해시값으로 변환 후 다시 문자열로 변환)
-(적용)
자바 MessageDigest를 이용한 Hash 알고리즘
MessageDigestJava에서 MD5, SHA를 이용한 알고리즘을 사용하려면 MessageDigest 클래스를 이용합니다.MessageDigest 클래스에는 update() 메소드가 있는데, 이 메소드를 호출할때마다 객체 내에 저장된 digest 값
ktko.tistory.com
//BASE64(HEX((SHA256("salt" + time)))
String getTimeHash(String time) throws NoSuchAlgorithmException {
String saltTime = securitySalt + time;
//SHA256("salt" + time)
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(saltTime.getBytes());
//SHA256 Data
byte[] shaByteData = messageDigest.digest();
messageDigest.update(shaByteData);
byte byteData[] = messageDigest.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
byte[] hash = sb.toString().getBytes();
String timeHash = Base64.encodeToString(hash, Base64.NO_WRAP);
return timeHash;
}//getTimeHash
-위 코드는 입력된 시간(time) 값에 대한 해시 값을 생성하는 함수입니다. 아래는 각 라인별로 코드의 기능을 설명합니다.
-saltTime: 입력된 시간(time) 값을 암호화용 salt 값(securitySalt)과 함께 결합하여 문자열로 생성합니다.
-messageDigest: MessageDigest 객체를 사용하여 SHA-256 알고리즘으로 메시지 다이제스트를 생성합니다.
-update(): MessageDigest 객체의 update() 메소드를 이용하여 문자열을 해싱합니다.
-shaByteData: update() 메소드로 해싱한 값을 shaByteData 배열에 저장합니다.
-byteData: shaByteData 배열을 한 번 더 MessageDigest 객체의 update() 메소드로 해싱하여 byteData 배열에 저장합니다. (배열을 한 번 더 저장하지 않으면 해시값이 제대로 생성되지 않음)
-sb: StringBuffer 객체를 사용하여 shaByteData 배열의 값을 16진수 문자열로 변환(Hex String, 16진수 암호화 하기로 약속 되어있어서 적용함, 필수는 아님)하고, sb에 저장합니다.
-hash: sb에 저장된 문자열을 바이트 배열로 변환하여 hash에 저장합니다.
-timeHash: Base64 인코딩을 사용하여 hash 값을 문자열로 인코딩하고, timeHash 변수에 저장합니다.
즉, 위 함수는 입력된 시간(time) 값을 해싱하여 결과값으로 문자열 형태로 반환합니다. 이때, 입력된 시간 값과 함께 사용되는 salt 값이 미리 정의되어 있으며, 해싱 알고리즘으로는 SHA-256이 사용됩니다. 이렇게 생성된 해시값은 암호화 및 인증과 같은 보안 처리에 사용될 수 있습니다.
-shaByteData 배열을 한 번 더 MessageDigest 객체의 update() 메소드로 해싱하여 byteData 배열에 저장하는 이유는 해시 체인(Hash chain)을 구성하기 위해서입니다.
해시 체인은 여러 개의 데이터를 연속적으로 해싱하여 이전 데이터의 해시값을 현재 데이터의 일부로 사용하는 것을 의미합니다. 이전 데이터의 해시값을 현재 데이터의 일부로 사용하면, 이전 데이터의 해시값이 변경되면 그 이후의 모든 데이터의 해시값도 변경되기 때문에 무결성 검증에 용이합니다.
따라서 shaByteData 배열을 한 번 더 MessageDigest 객체의 update() 메소드로 해싱하여 byteData 배열에 저장함으로써 이전 데이터의 해시값을 현재 데이터의 일부로 사용할 수 있도록 해시 체인을 구성할 수 있습니다. 이를 통해 해시 체인을 사용하여 무결성 검증을 할 수 있게 됩니다.
-MessageDigest 클래스는 해시 함수를 구현한 클래스입니다. 이 클래스는 update() 메소드를 이용하여 입력값을 추가할 수 있습니다.
update() 메소드는 바이트 배열 형태의 데이터를 매개변수로 받습니다. 이 메소드는 받은 데이터를 이용하여 내부 상태를 업데이트합니다.
보통 해시 함수는 입력값을 여러 개 받아서 그 값을 모두 연결(concatenate)한 후에 하나의 값으로 압축하는 과정을 거칩니다. 따라서 해시 함수의 update() 메소드는 이러한 과정에서 입력값을 중간 처리하는 역할을 합니다. 입력값이 더해질 때마다 내부 상태가 바뀌며, 최종적으로 해시값이 계산됩니다.
-SHA-256은 임의의 길이의 입력 메시지를 받아 고정 크기(256비트)의 출력 메시지를 생성하는 암호학적 해시 함수입니다. SHA-256은 SHA-2 해시 함수 패밀리에 속하며, SHA-224, SHA-384 및 SHA-512도 포함됩니다.
SHA-256은 입력 메시지를 512비트 블록으로 처리하고 각 블록에 대해 256비트의 메시지 다이제스트를 생성하여 작동합니다. 이 알고리즘은 비트 연산과 모듈러 산술을 포함한 일련의 논리 연산을 사용합니다.
SHA-256은 다음과 같은 세 가지 단계로 구성됩니다.
-초기화 단계: 입력 메시지를 처리하기 전에 내부 상태를 초기화합니다.
-처리 단계: 입력 메시지를 블록 단위로 처리하여 내부 상태를 업데이트합니다.
-출력 단계: 최종적으로 내부 상태를 이용하여 256비트 출력 메시지를 생성합니다.
SHA-256은 안전한 해시 함수로 알려져 있으며, 데이터 무결성 검사, 디지털 서명, 암호화 및 기타 보안 애플리케이션에서 사용됩니다.
SHA-256은 단방향 해시 함수로서, 입력 메시지를 고정된 길이의 출력 메시지로 변환하는 작업을 수행합니다. 이 출력 메시지는 입력 메시지에서 유추하기 어려우며, 일단 생성되면 다시 원래 메시지로 복원할 수 없습니다.
-HEX String은 16진수로 인코딩된 문자열을 나타내는 용어입니다. 16진수는 0부터 9까지의 숫자와 A부터 F까지의 문자를 사용하여 표현하는 진법 체계입니다. 이진수와 마찬가지로, 16진수는 컴퓨터에서 데이터를 저장하고 전송하는 데 사용됩니다.
HEX String은 일반적으로 두 자리 16진수 값을 갖는 문자 쌍으로 이루어진 문자열입니다. 예를 들어, "3A7F"는 16진수 값 3A와 7F를 나타내는 HEX String입니다. HEX String은 종종 바이너리 데이터를 ASCII 문자열로 표현할 때 사용됩니다. 이는 ASCII 문자열이 일반적으로 텍스트로 표시되는데 반해, 바이너리 데이터는 숫자로 표시되기 때문입니다.
HEX String은 암호학적 해시 함수나 디지털 서명과 같은 보안 애플리케이션에서도 사용됩니다. 예를 들어, SHA-256 해시 함수가 생성한 출력 값은 256비트 이진수로 표현됩니다. 이진수는 HEX String으로 변환하여 보다 쉽게 표시될 수 있습니다.
*참고
https://bamdule.tistory.com/233
[JAVA] SHA-256 암호화 하기
1. SHA-256란? SHA-256은 SHA(Secure Hash Algorithm) 알고리즘의 한 종류로서 256비트로 구성되며 64자리 문자열을 반환합니다. 해시 알고리즘 SHA-2 계열 중 하나이며, 2^256만큼 경우의 수를 만들 수 있습니다.
bamdule.tistory.com
https://angangmoddi.tistory.com/300
안드로이드 Sha256 Hash화
이번 글에선 Sha256알고리즘을 사용해 메시지의 Hash값을 구하는 법에 대해 알아보도록 하자. fun getSign(input: String): String{ val hash: ByteArray try{ val md = MessageDigest.getInstance("SHA-256") md.update(input.toByteArray(
angangmoddi.tistory.com
*참고
-SHA-256개념
https://losskatsu.github.io/blockchain/sha256/#4-sha-256-%EA%B3%BC%EC%A0%95
[블록체인] SHA-256 해시 알고리즘에 대해 알아보자
“[블록체인] SHA-256 해시 알고리즘
losskatsu.github.io
https://ryublock.tistory.com/5
[알쓸신블] 제3장 Hash (feat. SHA-256)
해시 함수는 임의의 길이를 갖는 임의의 데이터에 대해 고정된 길이의 데이터로 매핑하는 함수를 말한다. 이러한 해시 함수를 적용하여 나온 고정된 길이의 값을 해시값이라고 한다.마법의 주
ryublock.tistory.com