비밀번호 해싱과 암호화의 차이점


140

이 질문에 현재 가장 많이 투표 된 내용은 다음 과 같습니다.

보안 관련 문제는 아니지만 보안 문제가 아닌 또 다른 문제는 완전하며 암호 해시와 암호화의 차이점을 파악 하지 못하는 것 입니다. 프로그래머가 안전하지 않은 "암호 기억"기능을 제공하려는 코드에서 가장 일반적으로 발견됩니다.

이 차이점은 정확히 무엇입니까? 나는 항상 해싱이 일종의 암호화라는 인상을 받았습니다. 포스터가 말하는 안전하지 않은 기능은 무엇입니까?


비밀 / 암호를 단순히 해시해서는 안되는 이유에 대한 잘 작성된 기사입니다. 대신 HMAC를 사용하십시오. benlog.com/articles/2008/06/19/dont-hash-secrets
— Jay Kumar

StackExchange 보안 블로그 주제의 훌륭한 요약 : security.blogoverflow.com/2011/11/…
— David J. Liszewski

@JayKumar : 연결 한 기사가 매우 잘못되었습니다. 암호 키 (공격자에게 표시 될 것으로 예상 됨)와 MAC 키 (비밀 유지가 예상 됨)를 병합합니다. David J. Liszewski의 링크는 훨씬 정확한 설명을 제공합니다.
— Rufflewind

답변:


222

해싱은 단방향 함수입니다 (매핑, 매핑). 되돌릴 수 없으며 보안 해시 알고리즘을 적용하면 원래 문자열을 다시 가져올 수 없습니다. "충돌"이라고하는 것을 생성하는 것, 즉 동일한 해시를 제공하는 다른 문자열을 찾는 것입니다. 암호화 보안 해시 알고리즘은 충돌이 발생하지 않도록 설계되었습니다. 레인보우 테이블을 사용하여 보안 해시를 공격 할 수 있습니다. 레인보우 테이블 은 해시를 저장하기 전에 소금 을 적용하여 대응할 수 있습니다 .

암호화는 올바른 (양방향) 기능입니다. 뒤집을 수 있으므로 키가있는 경우 맹 글링 된 문자열을 해독하여 원래 문자열을 얻을 수 있습니다.

안전하지 않은 기능은 암호를 암호화하면 응용 프로그램에 어딘가에 키가 저장되어 있으며 데이터베이스 및 코드에 액세스하는 공격자가 키와 암호화 된 텍스트를 모두 가져 와서 원래 암호를 얻을 수 있다는 것입니다 해시에서는 불가능합니다.

사람들은 일반적으로 크래커가 데이터베이스 또는 코드를 소유하고 있다면 암호가 필요하지 않으므로 차이점이 있다고 말합니다. 이는 여전히 사용자 암호를 보호해야 할 의무가 있기 때문입니다. 주로 대부분의 사용자가 동일한 암호를 반복해서 사용하기 때문에 암호를 유출하여 더 큰 위험에 노출되기 때문입니다.


1
명확하게 해시로 원하는 보안을 얻으려면 해시가 되돌릴 수 없지만 특정 해시를 생성하는 다른 문자열을 생성하는 데 계산적으로 비실용적이라는 특정 속성을 가진 암호화 보안 해시 알고리즘이어야합니다.
— Tall Jeff

11
예, 아니오 ... 자신의 응용 프로그램 보안을 위해 해시 충돌을 발생시키기는 어렵지만 비가역성은 암호 유출을 피하기에 충분합니다.
— Dave Sherohman

5
실키 : 그리고 당신은 당신의 거친 해시 함수에서 원래 암호를 어떻게 정확하게 되 찾을 것입니까? 나는 당신이 데이브의 코멘트를 다시 읽어 제안
— Vinko Vrsalovic을

1
어쨌든 많은 충돌이있는 해시 함수가 암호 보안에 더 좋지만 더 많은 암호를 사용하여 계정에 로그인 할 수 있습니다.
— williamvicary

1
모든 해시 된 항목은 별도의 소금을 사용해야하므로 @ n00b 소금은 하드 코딩 할 수 없습니다. 소금의 요점은 UserA와 UserB가 모두 암호 "1234"를 사용하는 경우입니다. UserA의 암호를 찾은 경우 소금이 다르기 때문에 UserB가 동일한 암호를 사용했다고 말할 수 없습니다. 염분이 비밀로 유지되는 것은 보안 상 중요하지 않으며, 대부분의 구현에서는 해시를 나타내는 이진 얼룩의 앞면 또는 뒷면에 소금을 연결합니다.
— Scott Chamberlain

34

해싱은 단방향 기능이므로 암호를 해시 하면 원래 암호를 해시에서 다시 가져 오는 것이 매우 어렵습니다. 암호화는 양방향 기능으로, 암호화 된 텍스트에서 원본 텍스트를 훨씬 쉽게 가져올 수 있습니다.

일반 해싱은 사전 공격을 사용하여 쉽게 물리 칠 수 있습니다. 공격자는 사전의 모든 단어 (또는 특정 길이까지의 모든 문자 조합)를 미리 해시 한 다음이 새로운 사전을 사용하여 해시 된 비밀번호를 찾습니다. 저장된 각 해시 암호에 고유 한 임의 소금을 사용하면 공격자가이 방법을 사용하기가 훨씬 더 어려워집니다. 기본적으로 사용하는 모든 염분 값에 대해 새로운 고유 사전을 작성하여 공격 속도를 크게 늦출 필요가 있습니다.

암호화 알고리즘을 사용하여 비밀번호를 저장하는 것은 안전하지 않습니다. 사용자 나 관리자가 암호화 된 텍스트에서 원래 비밀번호를 다시 가져 오는 것이 더 쉬운 경우 공격자가 동일한 비밀번호를 사용하는 것이 더 쉽기 때문입니다.


12

암호화 및 해시 비밀번호

위 이미지에서 볼 수 있듯이 암호가 암호화 된 경우 누군가가 일반 텍스트 암호를 추출 할 수있는 숨겨진 비밀입니다. 그러나 비밀번호가 해시되면 해시 값에서 비밀번호를 복구하는 방법이 거의 없으므로 안심할 수 있습니다.


암호화 된 암호와 해시 된 암호 에서 추출 – 어느 것이 더 낫습니까?

암호화가 좋습니까?

일반 텍스트 비밀번호는 DES, AES와 같은 대칭 암호화 알고리즘을 사용하거나 다른 알고리즘을 사용하여 암호화하고 데이터베이스에 저장할 수 있습니다. 인증시 (사용자 이름 및 비밀번호로 ID 확인) 애플리케이션은 데이터베이스에 저장된 암호화 된 비밀번호를 해독하고 사용자가 제공 한 비밀번호와 동일한 지 비교합니다. 이 유형의 비밀번호 처리 방식에서는 누군가가 데이터베이스 테이블에 액세스하더라도 비밀번호를 재사용 할 수 없습니다. 그러나이 방법에도 나쁜 소식이 있습니다. 누군가가 응용 프로그램에서 사용하는 키와 함께 암호화 알고리즘을 얻는 경우 암호 해독을 통해 데이터베이스에 저장된 모든 사용자 암호를 볼 수 있습니다. "이것이 내가 가진 최선의 선택"이라고 소프트웨어 개발자가 소리를 지르지 만 더 좋은 방법이 있습니까?

암호화 해시 기능 (단방향 만)

예, 여기 요점을 놓친 것일 수 있습니다. 해독 및 비교할 필요가 없다는 것을 알고 계셨습니까? 암호를 일부 변환 된 단어로 변환 할 수있는 단방향 전용 변환 방법이 있지만 역방향 조작 (변환 된 단어에서 암호 생성)은 불가능합니다. 이제 누군가 누군가 데이터베이스에 액세스하더라도 변환 된 단어를 사용하여 비밀번호를 재생성하거나 추출 할 수있는 방법이 없습니다. 이 접근 방식에서는 일부 사용자의 최고 비밀 암호를 알 수있는 방법이 거의 없습니다. 여러 애플리케이션에서 동일한 비밀번호를 사용하여 사용자를 보호합니다. 이 접근법에 어떤 알고리즘을 사용할 수 있습니까?


그러나 서비스에 로그인하면 암호는 일반 텍스트 / 암호화로 전송됩니다. 암호는 서버에 해시로 보내면 비교할 수 있기 때문입니다. 해커가 해시를 알고 있다면 해시를 서버로 보내 로그인하십시오. 이것이 비교를 위해 암호를 서버로 암호화하여 암호를 해독하고 해시해야하는 이유입니다. 안전한가요? 암호가 장기간 해시되지 않은 형태로 저장되지 않고 더 이상 필요하지 않은 모든 암호화 / 일반 텍스트 암호가 메모리에서 지워진다면?
— AgentM

8

필자는 항상 최종 값을 원래 값으로 가져올 수있는 방식으로 암호화를 양방향으로 변환 할 수 있다고 생각했으며 해싱을 사용하면 최종 결과에서 원래 값으로 되돌릴 수 없습니다.


8

해싱 알고리즘은 일반적으로 암호화 방식이지만 암호화를 통해 해독 할 수 있지만 해싱은 불가능하다는 것이 주요 차이점입니다.

암호화 기능은 일반적으로 입력을 가져와 동일하거나 약간 더 큰 암호화 된 출력을 생성합니다.

해싱 함수는 입력을 가져와 일반적으로 고정 된 크기의 작은 출력을 생성합니다.

해시 된 결과를 가져 와서 원래의 입력을 되찾기 위해 "해시"할 수는 없지만 일반적으로 동일한 해시를 생성하는 것으로 무차별 대입 할 수 있습니다.

즉, 인증 체계가 암호를 가져 와서 해시하여 암호가 필요한 암호의 해시 버전과 비교하는 경우 실제로 원래 암호를 알 필요는 없으며 해시 만 알고 무차별 대입 할 수 있습니다 비밀번호가 다른 경우에도 일치하는 방법으로 이동하십시오.

해싱 함수는 일반적으로 충돌 가능성을 최소화하고 다른 것과 동일한 해시를 생성하는 것을 계산하기 어렵게 만들기 위해 만들어집니다.


4

이상적으로는 두 가지를 모두 수행해야합니다.

먼저 단방향 보안을 위해 패스 비밀번호를 해시하십시오. 추가 보안을 위해 소금을 사용하십시오.

그런 다음 암호 해시 데이터베이스가 손상된 경우 해시를 암호화하여 사전 공격으로부터 방어하십시오.


3
무엇으로 암호화합니까? 그들이 당신을 너무 세게 쳐서 모든 사용자의 암호 (해시, 암호화 또는 기타)로 데이터베이스에 도착했다면 암호를 해독하는 열쇠를 찾을 수 없었습니까?
— Luc

5
이것은 억압되지 않습니다. 응용 프로그램이 손상되지 않은 상태에서 데이터베이스가 손상 될 가능성을 배제해서는 안됩니다. 따라서 해시 암호화는 추가 보안 계층입니다.
— Arie

@Luc 나는 당신과 동의하지 않습니다, 나의 이전의 자기. 애플리케이션 코드 (또는 구성 파일)를 손상시키지 않는 너무 많은 SQL 주입을 보았으며 이제 비밀 을 추가 하는 것이 암호화 또는 후추 형태로 도움이된다고 생각합니다 . 그러나 해싱을 대체 해서는 안됩니다 . 보다 자세한 답변은 여기를 참조하십시오 : security.stackexchange.com/a/31846/10863
— Luc

3

해싱 :

단방향 알고리즘이며 일단 해시되면 롤백 할 수 없으며 이는 암호화에 대한 장점입니다.

암호화

암호화를 수행하면이를 수행 할 수있는 열쇠가 있습니다. 이 키가 유출되면 모든 비밀번호를 쉽게 해독 할 수 있습니다.

반면, 데이터베이스가 해킹되거나 서버 관리자가 DB에서 데이터를 가져 와서 해시 된 비밀번호를 사용한 경우에도 해커는 이러한 해시 된 비밀번호를 해제 할 수 없습니다. PBKDF2에 적절한 솔트 및 추가 보안으로 해싱을 사용하는 경우 실제로 실제로 불가능합니다.

해시 함수를 어떻게 작성해야하는지 보려면 여기 를 방문 하십시오 .

해싱을 수행하는 많은 알고리즘이 있습니다.

  1. MD5 - MD5 (Message Digest Algorithm 5) 해시 기능을 사용합니다. 출력 해시는 길이가 128 비트입니다. MD5 알고리즘은 Ron Rivest에 의해 1990 년대 초에 설계되었으며 오늘날 선호되는 옵션은 아닙니다.

  2. SHA1-1995 년에 게시 된 SHA1 (Security Hash Algorithm) 해시를 사용합니다. 출력 해시는 길이가 160 비트입니다. 가장 널리 사용되지만 오늘날 선호되는 옵션은 아닙니다.

  3. HMACSHA256 , HMACSHA384 , HMACSHA512 -SHA-2 제품군의 SHA-256, SHA-384 및 SHA-512 기능을 사용하십시오. SHA-2는 2001 년에 출판되었습니다. 해시 함수의 이름에서 알 수 있듯이 출력 해시 길이는 각각 256, 384 및 512 비트입니다.


1

다른 답변과 마찬가지로, 인용문의 맥락에서 해싱은 정보 보안에 사용될 수있는 도구이며, 암호화는 정보를 가져 오는 과정으로 권한이없는 사람들이 읽기 / 사용하기가 매우 어렵습니다.


-9

다음은 비밀번호 검색 중 하나를 사용하려는 이유 중 하나입니다.

사용자 비밀번호의 해시 만 저장하는 경우 '비밀번호 분실'기능을 제공 할 수 없습니다.


16
당신은 분명히 받아 들여진 대답을 충분히 읽지 못했습니다. 주의 깊게 읽으십시오 : 암호 검색 기능 을 제공 하지 않아야 합니다. 당신이있어 가정 암호 제공 리셋 기능을. vBulletin, phpBB, e107, IPB, 블로그 및 심지어 자체 맞춤형 CMS를 포함한 여러 웹 사이트를 수년간 관리해 왔습니다. 관리자는 절대 누군가의 사전 해시 암호를 가질 필요가 없습니다. 당신은하지 않습니다. 그리고 당신도 그것을 가져서는 안됩니다. 내가 말하는 것에 동의하지 않으면 내가 틀렸다는 것을 확신시켜 드리겠습니다.
— Lakey

3
WAY가 너무 화가 나서 죄송합니다. 너무 많은 웹 사이트가 암호를 일반 텍스트로 저장하는 것을 보았을 때 실망합니다. 참고 사항 : 일부 보안 관련 웹 사이트에서는 사용자가 주기적으로 암호를 변경하도록합니다. 사람들이 비밀번호를 "Password1"에서 "Password2"로 변경하지 않도록합니다. 따라서 나중에 이러한 비교를 수행하기 위해 일반 텍스트 비밀번호를 유지합니다. 좋은 습관이 아닙니다. 이 경우에 필요한 작업은 비밀번호 FIRST에 대한 분석을 수행하여 유사한 비밀번호를 만들어 각 비밀번호를 해시하고 해시 만 저장하는 것 입니다.
— Lakey

7
문제 없습니다. 다시 돌아가서 질문을 다시 읽고 추가 연구를하게되었으므로 모두 잃어 버리지는 않았습니다. 건배
— Philtron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.