๐Ÿ” Hash + StringBuffer

heeezniยท2025๋…„ 6์›” 5์ผ
0

Java ๋ฌธ๋ฒ•

๋ชฉ๋ก ๋ณด๊ธฐ
14/14
post-thumbnail

์•”ํ˜ธํ™” vs ํ•ด์‹œ

๊ตฌ๋ถ„์„ค๋ช…
์•”ํ˜ธํ™”(Encryption)๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“  ํ›„, ๋‚˜์ค‘์— ๋ณตํ˜ธํ™”(decryption) ํ•ด์„œ ๋‹ค์‹œ ์›๋ž˜๋Œ€๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์Œ
ํ•ด์‹œ(Hash)๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ •ํ•œ ๊ธธ์ด์˜ ๊ณ ์ •๋œ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟˆ. ํ•œ ๋ฒˆ ๋ฐ”๊พธ๋ฉด ์ ˆ๋Œ€ ๋˜๋Œ๋ฆด ์ˆ˜ ์—†์Œ(์ผ๋ฐฉํ–ฅ)

๐Ÿ” SHA-256

  • SHA-256์€ Secure Hash Algorithm 256-bit์˜ ์•ฝ์ž
  • SHA-256์€ ์ผ๋ฐฉํ–ฅ ํ•ด์‹œ ํ•จ์ˆ˜
  • ํ•ด์‹œํ•จ์ˆ˜: ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์ •๋œ ๊ธธ์ด(256๋น„ํŠธ)์˜ ํ•ด์‹œ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜
    โžก ํ•ญ์ƒ 64์ž๋ฆฌ 16์ง„์ˆ˜ ๋ฌธ์ž์—ด
  • ํ•ด์‹œ๋Š” ๋น„๊ฐ€์—ญ์ (์ ˆ๋Œ€ ๋ณต์› ์•ˆ ๋จ)
  • ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ DB์— ์ €์žฅํ•  ๋•Œ, ํ‰๋ฌธ ๋Œ€์‹  ํ•ด์‹œ๊ฐ’(Digest) ์„ ์ €์žฅ

StringBuffer

โœ…StringBuffer๋Š” String์˜ "๋ถˆ๋ณ€์„ฑ(immutable)" ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํด๋ž˜์Šค
๋ฌธ์ž์—ด์„ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜์ •ยท๊ฒฐํ•ฉ๊ฐ€๋Šฅํ•œ ๊ฐ€๋ณ€ ๋ฌธ์ž์—ด ํด๋ž˜์Šค

StringBuffer ์ฃผ์š” ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ์„ค๋ช…
append()๋ฌธ์ž์—ด์„ ๋์— ์ถ”๊ฐ€
insert()์ง€์ •ํ•œ ์œ„์น˜์— ๋ฌธ์ž์—ด ์‚ฝ์ž…
delete()์ง€์ •ํ•œ ๋ฒ”์œ„ ๋ฌธ์ž์—ด ์‚ญ์ œ
replace()๋ฒ”์œ„ ๋‚ด ๋ฌธ์ž์—ด์„ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒด
reverse()๋ฌธ์ž์—ด์„ ๋’ค์ง‘์Œ
setLength()๋ฌธ์ž์—ด ๊ธธ์ด ์กฐ์ ˆ (๊ธธ์ด ์ค„์ด๊ฑฐ๋‚˜ ๋Š˜๋ฆผ)
toString()์ตœ์ข… ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜ (String์œผ๋กœ ๋ณ€ํ™˜)
StringBuffer sql = new StringBuffer();
sql.append("insert into admin(id, pwd, name, email) "); 
sql.append("values(?,?,?,?)");

PreparedStatement pstmt = null;

try {
	pstmt = appmain.con.prepareStatement(sql.toString());

	// ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’ ์„ธํŒ…
	pstmt.setString(1, t_id.getText());
	pstmt.setString(2, StringUtil.getSecuredPass(new String(t_pwd.getPassword())));
	pstmt.setString(3, t_name.getText());
	pstmt.setString(4, t_email.getText());

	int result = pstmt.executeUpdate(); // DML ์‹คํ–‰

	if (result > 0) {
		JOptionPane.showMessageDialog(this, "๊ด€๋ฆฌ์ž ๊ฐ€์ž… ์„ฑ๊ณต");
	} else {
		JOptionPane.showMessageDialog(this, "๋“ฑ๋ก์‹คํŒจ");
	}
} catch (SQLException e) {
	e.printStackTrace();
} finally {
	if (pstmt != null) {
		try {
			pstmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
  • String์€ ๋ถˆ๋ณ€(immutable) ๊ฐ์ฒด๋‹ค.
    โ†’ ํ•œ ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด ๋‚ด๋ถ€ ๋ฌธ์ž์—ด์„ ์ ˆ๋Œ€ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Œ
    โ†’ "a" + "b" ๊ฐ™์€ ์—ฐ์‚ฐ์„ ํ•˜๋ฉด, ์ƒˆ๋กœ์šด String ๊ฐ์ฒด๊ฐ€ ๊ณ„์† ์ƒ์„ฑ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒ

  • ๊ทธ๋ž˜์„œ ๋ฌธ์ž์—ด์„ ๊ณ„์† ๋ถ™์ด๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” StringBuffer ๋˜๋Š” StringBuilder๋ฅผ ์‚ฌ์šฉํ•จ

๊ตฌ๋ถ„์„ค๋ช…
String๋ถˆ๋ณ€ ๊ฐ์ฒด. ๋ฌธ์ž์—ด ์ˆ˜์ • ์‹œ ์ƒˆ ๊ฐ์ฒด ์ƒ์„ฑ๋จ.
StringBuffer๊ฐ€๋ณ€ ๊ฐ์ฒด. ๋‚ด๋ถ€ ๋ฒ„ํผ์—์„œ ๋ฌธ์ž์—ด์„ ์ˆ˜์ •ํ•จ โ†’ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ
StringBuilderStringBuffer์™€ ๊ฑฐ์˜ ๊ฐ™์ง€๋งŒ, ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ ์ „์šฉ(์†๋„ ๋น ๋ฆ„)

SQL๋ฌธ ์กฐ๋ฆฝ์—๋Š” StringBuffer, ๋ฐ”์ธ๋”ฉ์—๋Š” String์„ ์จ๋ผ


admin table ์กฐ๊ฑด

create table admin(
	admin_id int primary key auto_increment,
	id varchar(20),
	pwd varchar(64),
    --pwd๋Š” ์•”ํ˜ธํ™”๋•Œ๋ฌธ์— 64์ž
	name varchar(20),
	email varchar(30)
);

StringUtil.getSecuredPass(pwd)

JavaSE๋Š” ์ด๋ฏธ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•จ์ˆ˜๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Œ

public class StringUtil {
	
	public static String getSecuredPass(String pwd) {
		
		String pass = pwd;
		StringBuffer sb = new StringBuffer(); // โœ… String์˜ ๋ถˆ๋ณ€์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ฐ์ฒด
		
		try {
			// 1๏ธโƒฃ SHA-256 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ์ฒด ์ƒ์„ฑ
			MessageDigest md = MessageDigest.getInstance("SHA-256");
			
			// 2๏ธโƒฃ ์ž…๋ ฅ ๋ฌธ์ž์—ด์„ UTF-8 ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ์ชผ๊ฐœ๊ธฐ
			byte[] hash = md.digest(pass.getBytes("UTF-8")); 
			// System.out.println(hash.length); // 32 ์ถœ๋ ฅ: 256๋น„ํŠธ = 32๋ฐ”์ดํŠธ
			
			// 3๏ธโƒฃ ์ž˜๊ฒŒ ์ชผ๊ฐœ์ง„ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ 16์ง„์ˆ˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
			for (int i = 0; i < hash.length; i++) {
				/*
				 * byte ๋ฐ์ดํ„ฐ๋ฅผ 16์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ, byte๊ฐ’์ด ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ
				 * intํ˜•์œผ๋กœ ๋ณ€ํ™˜๋˜๋ฉด์„œ ๋ถ€ํ˜ธ ๋น„ํŠธ๊ฐ€ ์ƒ๊ธด๋‹ค.
				 * ์ด ๋ถ€ํ˜ธ ๋น„ํŠธ๋Š” ์•”ํ˜ธํ™”์™€ ๋ฌด๊ด€ํ•˜๋ฏ€๋กœ ์ œ๊ฑฐํ•ด์ค˜์•ผ ํ•จ.
				 * 
				 * โ†’ โœ… 0xff์™€ & ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€ํ˜ธ ๋น„ํŠธ ์ œ๊ฑฐ (์ •์ˆ˜ํ˜• 0~255๋กœ ์ฒ˜๋ฆฌ)
				 * ์ฐธ๊ณ : Java์—์„œ byte ์—ฐ์‚ฐ ์‹œ ์ž๋™์œผ๋กœ int๋กœ ์Šน๊ฒฉ๋จ
				 */
				String hex = Integer.toHexString(0xff & hash[i]); 
				
				// ํ•œ ์ž๋ฆฌ ์ˆ˜์ธ ๊ฒฝ์šฐ ์•ž์— 0์„ ๋ถ™์—ฌ ๋‘ ์ž๋ฆฌ๋กœ ๋งŒ๋“ค์–ด์คŒ (64์ž ๋งž์ถ”๊ธฐ ์œ„ํ•ด)
				if (hex.length() < 2) sb.append("0");
				
				// String ๋ˆ„์ 
				sb.append(hex);
			}            
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		// ์ตœ์ข…์ ์œผ๋กœ ์™„์„ฑ๋œ 64์ž๋ฆฌ SHA-256 ํ•ด์‹œ ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜
		return sb.toString();
	}  //sb๋Š” ์ŠคํŠธ๋ง ์ž๋ฃŒํ˜• ์•„๋‹ˆ๋‹ˆ๊นŒ toString๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
}

๐Ÿ”‘ ๋กœ๊ทธ์ธ

์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•  ๋•Œ๋Š”,
1๏ธโƒฃ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋˜‘๊ฐ™์ด SHA-256์œผ๋กœ ํ•ด์‹œ
2๏ธโƒฃ DB์— ์žˆ๋Š” ๊ฐ’๊ณผ ๋น„๊ตํ•ด์„œ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ

String pwd = new String(t_pwd.getPassword()); // ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ
String hash = StringUtil.getSecuredPass(pwd); // โ†’ โœ…SHA-256 ํ•ด์‹œ๊ฐ’ ์ƒ์„ฑ

String sql = "select * from admin where id=? and pwd=?"; // โœ…DB์— ์ €์žฅ๋œ ํ•ด์‹œ๊ฐ’๊ณผ ๋น„๊ต

pstmt.setString(1, id);
pstmt.setString(2, hashPwd);
profile
์•„์ด๋“ค์˜ ๊ฐ€๋Šฅ์„ฑ์„ ๋ฏฟ์—ˆ๋˜ ๋งˆ์Œ ๊ทธ๋Œ€๋กœ, ์ด์ œ๋Š” ๋‚˜์˜ ๊ฐ€๋Šฅ์„ฑ์„ ๋ฏฟ๊ณ  ๋‚˜์•„๊ฐ€๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€