JiYoung Dev πŸ–₯

SHA-256λ₯Ό μ‚¬μš©ν•œ λ¬Έμžμ—΄ μ•”ν˜Έν™” 예제 - Java λ³Έλ¬Έ

Study/λ³΄μ•ˆ

SHA-256λ₯Ό μ‚¬μš©ν•œ λ¬Έμžμ—΄ μ•”ν˜Έν™” 예제 - Java

Shinjio 2023. 12. 14. 22:34

μ§€λ‚œλ²ˆ PKI ν¬μŠ€νŒ…μ—μ„œ μ΄μ–΄μ§€λŠ” λ‚΄μš©μž…λ‹ˆλ‹€. 

 

PKI의 μ•”ν˜Έν™” 방법에 λŒ€ν•΄ μ„€λͺ…ν•˜λ©΄μ„œ λ‹€μ–‘ν•œ μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜μ΄ λ“±μž₯ν–ˆμŠ΅λ‹ˆλ‹€. 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” κ·Έ 쀑 SHA-256을 μ‚¬μš©ν•œ μ•”ν˜Έν™” 방법을 Java둜 직접 κ΅¬ν˜„ν•΄ 보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€. 

 

본둠에 듀어가기에 μ•žμ„œ SHA-256 μ•Œκ³ λ¦¬μ¦˜μ΄ 무엇인지 λ‹€μ‹œ μƒκΈ°μ‹œν‚€κ³  λ„˜μ–΄κ°€κ² μŠ΅λ‹ˆλ‹€. 

 


 

SHA(Secure Hash Algorithm) : μ•ˆμ „ν•œ ν•΄μ‹œ μ•Œκ³ λ¦¬μ¦˜

 

SHA μ•Œκ³ λ¦¬μ¦˜μ΄λž€ MD4 ν•΄μˆ˜ ν•¨μˆ˜μ— κΈ°μ΄ˆν•˜μ—¬ λ§Œλ“€μ–΄μ§„ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ„œλ‘œ κ΄€λ ¨λœ μ•”ν˜Έν•™μ  ν•΄μ‹œ ν•¨μˆ˜λ“€μ˜ λͺ¨μŒμ„ λ§ν•©λ‹ˆλ‹€. SHA ν•¨μˆ˜κ΅°μ— μ†ν•˜λŠ” 졜초의 ν•¨μˆ˜λŠ” SHA-0, κ·Έ ν›„ λ°œν‘œλœ SHA ν•¨μˆ˜λ₯Ό SHA-1, κ·Έ ν›„ 4μ’…λ₯˜μ˜ λ³€ν˜•λœ ν•¨μˆ˜λ₯Ό SHA-2(SHA-224, SHA-256, SHA-384, SHA-512)κ°€ μžˆμŠ΅λ‹ˆλ‹€. 

 

SHA-1은 SHA ν•¨μˆ˜ 쀑 κ°€μž₯ 많이 쓰이며, TLS, SSL, IPSec λ“± λ§Žμ€ λ³΄μ•ˆ ν”„λ‘œν† μ½œκ³Ό ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ SHA-0, SHA-1은 ν•΄μ‹œ 좩돌이 λ°œμƒν•˜μ—¬ 점차적으둜 μ‚¬μš©μ„ μ€„μ—¬κ°€λŠ” μΆ”μ„Έμž…λ‹ˆλ‹€. 

** SHA-1 : ν•΄μ‹œκ°’μœΌλ‘œ 160bitλ₯Ό 좜λ ₯

** ν•΄μ‹œμΆ©λŒ : μ„œλ‘œ λ‹€λ₯Έ λ‘κ°œμ˜ μž…λ ₯값에 λŒ€ν•΄ λ™μΌν•œ 좜λ ₯을 λ‚΄λŠ” 상황

 

 

 


 

예제

 

SHA1("The quick brown fox jumps over the lazy dog")
  = 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12

 

 

ν•΄μ‹œκ°’μ€ λˆˆμ‚¬νƒœ 효과 λ•Œλ¬Έμ— λ©”μ‹œμ§€κ°€ 단 1λΉ„νŠΈλΌλ„ λ°”λ€Œμ–΄λ„ κ·Έ κ²°κ³ΌλŠ” μ™„μ „νžˆ λ°”λ€” 수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜μ˜ μ˜ˆμ‹œλŠ” μœ„μ˜ μ˜ˆμ œμ—μ„œ λ§ˆμ§€λ§‰μ— λ§ˆμΉ¨ν‘œ(.)λ₯Ό 찍은 κ²ƒμž…λ‹ˆλ‹€. 

 

SHA1("The quick brown fox jumps over the lazy dog.")
  = 408d94384216f890ff7a0c3528e8bed1e0b01621

 

 


 

SHA-256 Java 예제 

 

μžλ°”μ—μ„œ SHA μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ” java.security.MessageDigest 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•©λ‹ˆλ‹€. 

 

 

 

MessageDigest 객체의 getInstance λ©”μ„œλ“œλ₯Ό 톡해 μ•„λž˜μ˜ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

 

 

 

좜처 : https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#MessageDigest

 

 

MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(message.getBytes());
md.digest();

 

 

 

getInstance(String algorithm)은 μž…λ ₯ν•œ ν•΄μ‹œ μ•Œκ³ λ¦¬μ¦˜μ„ μˆ˜ν–‰ν•˜λŠ” MessageDigest 객체λ₯Ό μƒμ„±ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€. νŒŒλΌλ―Έν„°λ‘œ λ°›λŠ” μ•Œκ³ λ¦¬μ¦˜μ€ NoSuchAlgorithmException λ•Œλ¬Έμ— try~catch둜 κ°μ‹Έμ€˜μ•Ό ν•©λ‹ˆλ‹€. 

 

update(byte[] input)은 객체 내에 μ €μž₯된 digest 값을 ν•΄μ‹±ν•©λ‹ˆλ‹€. inputμ—λŠ” μ•”ν˜Έν™”ν•˜κ³  싢은 ν…μŠ€νŠΈλ₯Ό λ°”μ΄νŠΈ λ°°μ—΄λ‘œ λ„£μŠ΅λ‹ˆλ‹€. 

 

digest()λŠ” update()λ₯Ό μ‹€ν–‰ν•˜μ—¬, ν•΄μ‹œ 계산 μ™„λ£Œ ν›„ 결과값을 λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€. 

 

μ΄λ ‡κ²Œ μ•”ν˜Έν™”ν•œ ν•΄μ‹œ κ²°κ³ΌλŠ” λ°”μ΄νŠΈ λ°°μ—΄λ‘œ λ¦¬ν„΄λ˜λ―€λ‘œ 16μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” μž‘μ—…μ„ 거쳐야 ν•©λ‹ˆλ‹€. 

 

 

StringBuilder builder = new StringBuilder();
for(byte b : bytes){
	builder.append(String.format(%02x", b));
	}
	return builder.toString();

 

 

λΆˆλ³€κ°μ²΄μΈ String 객체 λŒ€μ‹  StringBuilderλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ λ°˜λ³΅λ¬Έμ„ 톡해 λ¬Έμžμ—΄μ„ λ³€κ²½ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€. 

 

μž…λ ₯값인 byte[] λ°°μ—΄μ˜ μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© λ°˜λ³΅λ¬Έμ„ 톡해 StringBuilder에 16μ§„μˆ˜λ‘œ λ„£μŠ΅λ‹ˆλ‹€. 

(%02xλŠ” 2자리 Hex String으둜 좜λ ₯ν•©λ‹ˆλ‹€.)

 

 

 

 

 

ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄ 보면 μ•„λž˜μ™€ 같은 κ²°κ³Όκ°€ 좜λ ₯λ©λ‹ˆλ‹€. 

 

 

 

 

SHA 256 은 256bit의 λ¬Έμžμ—΄μž…λ‹ˆλ‹€.

16μ§„μˆ˜ ν•˜λ‚˜λ‹Ή 4bitμ΄λ―€λ‘œ 총 64개의 16μ§„μˆ˜λ‘œ 이루어진 결과값이 좜λ ₯λ©λ‹ˆλ‹€.