<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://www.gaonwiki.com/w/index.php?action=history&amp;feed=atom&amp;title=%EC%86%94%ED%8A%B8%28%ED%95%B4%EC%8B%9C%29</id>
	<title>솔트(해시) - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://www.gaonwiki.com/w/index.php?action=history&amp;feed=atom&amp;title=%EC%86%94%ED%8A%B8%28%ED%95%B4%EC%8B%9C%29"/>
	<link rel="alternate" type="text/html" href="https://www.gaonwiki.com/w/index.php?title=%EC%86%94%ED%8A%B8(%ED%95%B4%EC%8B%9C)&amp;action=history"/>
	<updated>2026-07-08T20:49:26Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://www.gaonwiki.com/w/index.php?title=%EC%86%94%ED%8A%B8(%ED%95%B4%EC%8B%9C)&amp;diff=107884&amp;oldid=prev</id>
		<title>Gaon12: 시작</title>
		<link rel="alternate" type="text/html" href="https://www.gaonwiki.com/w/index.php?title=%EC%86%94%ED%8A%B8(%ED%95%B4%EC%8B%9C)&amp;diff=107884&amp;oldid=prev"/>
		<updated>2025-07-03T00:44:08Z</updated>

		<summary type="html">&lt;p&gt;시작&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 개요 ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;솔트(Salt)&amp;#039;&amp;#039;&amp;#039;는 [[암호학]]에서 [[패스워드]] 등의 데이터를 [[해시]]할 때 원본 데이터에 추가하는 랜덤한 문자열이다. &amp;lt;s&amp;gt;요리할 때 넣는 그 소금 맞다&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
솔트의 주된 목적은 &amp;#039;&amp;#039;&amp;#039;[[레인보우 테이블]] 공격&amp;#039;&amp;#039;&amp;#039;을 방지하고, 동일한 패스워드라도 서로 다른 해시값을 생성하게 하는 것이다. 같은 비밀번호 쓰는 사람들 많은데 해시값까지 똑같으면 곤란해 버리기 때문이다.&lt;br /&gt;
&lt;br /&gt;
== 작동 원리 ==&lt;br /&gt;
일반적인 해시 과정:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
패스워드: &amp;quot;password123&amp;quot;&lt;br /&gt;
해시값: 482c811da5d5b4bc6d497ffa98491e38&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
솔트를 사용한 해시 과정:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
패스워드: &amp;quot;password123&amp;quot;&lt;br /&gt;
솔트: &amp;quot;aB3$xY9z&amp;quot;&lt;br /&gt;
결합: &amp;quot;password123aB3$xY9z&amp;quot;&lt;br /&gt;
해시값: 7d865e959b2466918c9863afca942d0f&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이렇게 하면 같은 패스워드라도 솔트가 다르면 완전히 다른 해시값이 나온다. &amp;lt;s&amp;gt;마력소비 아니 전기 소비 마법&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 필요성 ==&lt;br /&gt;
&lt;br /&gt;
=== 레인보우 테이블 공격 방지 ===&lt;br /&gt;
[[레인보우 테이블]]은 자주 사용되는 패스워드들의 해시값을 미리 계산해둔 거대한 &amp;#039;&amp;#039;&amp;#039;치트시트&amp;#039;&amp;#039;&amp;#039;다. 게임 공략집 같은 거라고 보면 된다.&lt;br /&gt;
&lt;br /&gt;
솔트 없이 해시된 패스워드:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;123456&amp;quot; → 해시값 A&lt;br /&gt;
* &amp;quot;password&amp;quot; → 해시값 B&lt;br /&gt;
* &amp;quot;qwerty&amp;quot; → 해시값 C&lt;br /&gt;
&lt;br /&gt;
공격자가 해시값 A를 보면 &amp;#039;&amp;#039;&amp;#039;즉시&amp;#039;&amp;#039;&amp;#039; &amp;quot;123456&amp;quot;이라는 걸 알 수 있다. &amp;lt;s&amp;gt;보안이고 뭐고 없다&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
솔트를 사용하면:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;123456&amp;quot; + 솔트1 → 해시값 X&lt;br /&gt;
* &amp;quot;123456&amp;quot; + 솔트2 → 해시값 Y&lt;br /&gt;
* &amp;quot;password&amp;quot; + 솔트3 → 해시값 Z&lt;br /&gt;
&lt;br /&gt;
이제 공격자는 각각의 솔트에 대해 &amp;#039;&amp;#039;&amp;#039;개별적으로&amp;#039;&amp;#039;&amp;#039; 레인보우 테이블을 만들어야 한다.&lt;br /&gt;
&lt;br /&gt;
=== 동일 패스워드 구분 ===&lt;br /&gt;
솔트가 없다면:&lt;br /&gt;
&lt;br /&gt;
* 사용자 A: &amp;quot;password123&amp;quot; → 해시값 같음&lt;br /&gt;
* 사용자 B: &amp;quot;password123&amp;quot; → 해시값 같음&lt;br /&gt;
&lt;br /&gt;
솔트를 사용하면:&lt;br /&gt;
&lt;br /&gt;
* 사용자 A: &amp;quot;password123&amp;quot; + 솔트A → 해시값 다름&lt;br /&gt;
* 사용자 B: &amp;quot;password123&amp;quot; + 솔트B → 해시값 다름&lt;br /&gt;
&lt;br /&gt;
이제 설령 같은 비밀번호를 써도 &amp;#039;&amp;#039;&amp;#039;티가 안 난다&amp;#039;&amp;#039;&amp;#039;. &amp;lt;s&amp;gt;프라이버시 보호 완료&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 구현 방법 ==&lt;br /&gt;
&lt;br /&gt;
=== 솔트 생성 ===&lt;br /&gt;
솔트는 반드시 &amp;#039;&amp;#039;&amp;#039;암호학적으로 안전한 난수 생성기&amp;#039;&amp;#039;&amp;#039;로 만들어야 한다.&lt;br /&gt;
&lt;br /&gt;
* 길이: 최소 16바이트 (128비트) 이상 권장&lt;br /&gt;
* 유일성: 각 사용자마다 &amp;#039;&amp;#039;&amp;#039;고유한&amp;#039;&amp;#039;&amp;#039; 솔트 사용&lt;br /&gt;
* 예측 불가능성: &amp;lt;s&amp;gt;그냥 &amp;quot;salt123&amp;quot; 이런 거 쓰면 안 된다고&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 저장 방식 ===&lt;br /&gt;
일반적으로 &amp;#039;&amp;#039;&amp;#039;솔트와 해시값을 함께&amp;#039;&amp;#039;&amp;#039; 저장한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
사용자ID | 솔트 | 해시값&lt;br /&gt;
user1 | aB3$xY9z | 7d865e959b2466918c9863afca942d0f&lt;br /&gt;
user2 | mN8&amp;amp;vC2k | f4a8b2c9e1d3f7e5a6b9c8d2e1f4a7b6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
솔트가 공개되어도 상관없다.&amp;lt;ref name=&amp;quot;salt_open&amp;quot;&amp;gt;일반적으로 솔트는 DB 내부에서만 사용되므로 대중에게 보여줄 이유가 없다. 공개한다고 도움이 되진 않는다. 만약 해시 함수가 약하거나, 사용자 비밀번호가 단순하다면, 솔트+해시가 같이 유출되었을 때 브루트포스에 위험하다.&amp;lt;/ref&amp;gt; 어차피 솔트의 목적은 &amp;#039;&amp;#039;&amp;#039;비밀 유지&amp;#039;&amp;#039;&amp;#039;가 아니라 &amp;#039;&amp;#039;&amp;#039;레인보우 테이블 무력화&amp;#039;&amp;#039;&amp;#039;이기 때문이다.&lt;br /&gt;
&lt;br /&gt;
== 주의사항 ==&lt;br /&gt;
&lt;br /&gt;
=== 하면 안 되는 것들 ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;전역 솔트&amp;#039;&amp;#039;&amp;#039; 사용하기. 모든 사용자가 같은 솔트 쓰면 의미없음&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;짧은 솔트&amp;#039;&amp;#039;&amp;#039; 사용하기&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;예측 가능한 솔트&amp;#039;&amp;#039;&amp;#039; 사용하기&amp;lt;ref&amp;gt;예: 특정값(1234 등)&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;솔트 재사용&amp;#039;&amp;#039;&amp;#039; 하기&lt;br /&gt;
&lt;br /&gt;
=== 올바른 방법 ===&lt;br /&gt;
&lt;br /&gt;
* 각 패스워드마다 &amp;#039;&amp;#039;&amp;#039;새로운&amp;#039;&amp;#039;&amp;#039; 솔트 생성&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;충분한 길이&amp;#039;&amp;#039;&amp;#039;의 솔트 사용 (16바이트 이상)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;암호학적으로 안전한&amp;#039;&amp;#039;&amp;#039; 난수 생성기 사용&lt;br /&gt;
* 솔트와 해시값 &amp;#039;&amp;#039;&amp;#039;모두&amp;#039;&amp;#039;&amp;#039; 저장&lt;br /&gt;
&lt;br /&gt;
== 관련 기술 ==&lt;br /&gt;
&lt;br /&gt;
=== 솔트 내장 해시 ===&lt;br /&gt;
&lt;br /&gt;
bcrypt, scrypt, Argon2 등은 솔트 기능을 &amp;#039;&amp;#039;&amp;#039;내장&amp;#039;&amp;#039;&amp;#039;한 패스워드 해싱 함수들이다.  &lt;br /&gt;
솔트 생성과 해시 계산을 안전하게 자동 처리하며, 반복 횟수 조절 등으로 &amp;#039;&amp;#039;&amp;#039;브루트포스 공격에도 강하다&amp;#039;&amp;#039;&amp;#039;.  &lt;br /&gt;
직접 솔트와 해시를 구현하다가는 보안 결함이 생기기 쉬우므로, &amp;#039;&amp;#039;&amp;#039;검증된 알고리즘을 사용하는 것이 안전하다&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
* 자동 솔트 생성&lt;br /&gt;
* 느린 해싱 (브루트포스 방지)&lt;br /&gt;
* 검증된 보안성&lt;br /&gt;
&lt;br /&gt;
=== 펩퍼(Pepper) ===&lt;br /&gt;
솔트의 &amp;#039;&amp;#039;&amp;#039;상위 호환&amp;#039;&amp;#039;&amp;#039; 개념으로, 서버의 &amp;#039;&amp;#039;&amp;#039;비밀 키&amp;#039;&amp;#039;&amp;#039;를 추가로 사용한다.&lt;br /&gt;
&lt;br /&gt;
* 솔트: 공개되어도 됨. 근데 굳이 공개할 필욘 없긴 하다.&amp;lt;ref name=&amp;quot;salt_open&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
* 펩퍼: &amp;#039;&amp;#039;&amp;#039;절대&amp;#039;&amp;#039;&amp;#039; 공개되면 안 됨. 해시 계산 시 비밀 키처럼 쓰이는 값이다.&amp;lt;ref&amp;gt;예: 해시(패스워드 + 펩퍼) 또는 해시(펩퍼 + 패스워드 + 솔트)&amp;lt;/ref&amp;gt; 솔트는 공격 지연용 공개 정보, 펩퍼는 공격 차단용 비밀 정보이기에 솔트와 동일선상에서 비교하기엔 무리이다. 또한 DB서버와 동일한 서버에 저장해 두면 &amp;#039;&amp;#039;&amp;#039;절대 안된다.&amp;#039;&amp;#039;&amp;#039; 해커가 DB뿐만 아니라 웹서버 또는 애플리케이션 서버까지 장악했을 경우, 펩퍼까지 유출되어 패스워드를 복구당할 수 있다. 해시 알고리즘이 아무리 강해도 의미 없어진다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 여담 ==&lt;br /&gt;
&lt;br /&gt;
* 솔트라는 이름은 요리에서 &amp;#039;&amp;#039;&amp;#039;간을 맞추는&amp;#039;&amp;#039;&amp;#039; 소금에서 따온 것이다.&lt;br /&gt;
* 초기 [[UNIX]] 시스템에서는 솔트 길이가 고작 &amp;#039;&amp;#039;&amp;#039; 12비트(!)&amp;#039;&amp;#039;&amp;#039;였다. 지금 기준으론 장난감 수준. 요즘은 최소 &amp;#039;&amp;#039;&amp;#039; 128비트&amp;#039;&amp;#039;&amp;#039; 솔트가 표준이다.&lt;br /&gt;
== 관련 문서 ==&lt;br /&gt;
&lt;br /&gt;
* [[해시 함수]]&lt;br /&gt;
* [[패스워드]]&lt;br /&gt;
* [[레인보우 테이블]]&lt;br /&gt;
* [[bcrypt]]&lt;br /&gt;
* [[암호학]]&lt;br /&gt;
* [[브루트포스 공격]]&lt;br /&gt;
&lt;br /&gt;
== 각주 ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- 분류 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[분류:암호학]]&lt;br /&gt;
[[분류:정보보안]]&lt;br /&gt;
[[분류:컴퓨터 과학]]&lt;/div&gt;</summary>
		<author><name>Gaon12</name></author>
	</entry>
</feed>