암호화(C)

crypt (C)

cryptPOSIX C 라이브러리 기능이다. 일반적으로 사용자 계정 암호의 해시를 계산하는 데 사용된다. 함수는 소금인코딩하는 텍스트 문자열(보통 처음 두 문자는 소금 그 자체, 나머지는 해시 결과)을 출력하고 사용된 해시 알고리즘을 식별한다(기본값은 아래에서 설명하는 "전통"으로 함). 이 출력 문자열은 암호 레코드를 형성하며, 보통 텍스트 파일에 저장된다.

좀 더 형식적으로, 암호화는 암호 유효성 검사와 Unix 시스템의 저장을 위한 암호키 파생 기능을 제공한다.

Unix 암호화 유틸리티와의 관계

유닉스에는 관련 없는 암호 유틸리티가 있어, C 라이브러리 기능과 혼동되는 경우가 많다. 이 둘을 구별하기 위해 작성자는 유틸리티 프로그램을 Unix 수동 페이지의 섹션 1에 문서화되기 때문에 종종 crypt(1)라고 부르고, C 라이브러리 함수는 crypt(3)로 언급하는데, 그 설명서는 수동 섹션 3에 있기 때문이다.[1]

세부 사항

이 같은 암호 함수는 저장용 새 해시를 생성하는 데 사용되며, 비교를 위해 기록된 소금으로 프로페퍼된 암호를 해시하는 데도 사용된다.

암호 라이브러리 루틴의 현대 유닉스 구현은 다양한 해시 체계를 지원한다. 사용되는 특정 해시 알고리즘은 모듈러 암호화 포맷이라는 사실상의 표준에 따라 결과 해시텍스트에서 고유한 코드 접두사로 식별할 수 있다.[2][3][4]

crypt() Perl,[5] PHP,[6] Pike,[7][8] Python, Ruby[9] 프로그래밍 언어에도 라이브러리 기능이 포함되어 있다.

암호화에 의해 지원되는 키 파생 기능

시간이 지나면서 다양한 알고리즘이 도입되었다. 이전 버전과의 호환성을 위해, 각 계획은 나중에 MCF(Modular Crypt Format)라고 불리는 암호 해시직렬화하는 어떤 관례를 사용하기 시작했다.[3] 사실상의 MCF 표준 이전에 생성된 오래된 암호(3) 해시는 체계마다 다를 수 있다. 암호 해싱 대회 동안 모듈식 암호화 포맷의 잘 정의된 서브셋이 만들어졌다.[3] 형식은 다음과 같이 정의된다.[10]

$$BODY$$lt;id>[$$BODY$$lt;param>=<value>(,<param>=<value>)*][$$BODY$$lt;salt>[$$BODY$$lt;hash>]]

어디에

  • id: 해싱 알고리즘을 나타내는 식별자(MD5의 경우 1, SHA-256의 경우 5 등)
  • param 이름과 그 이름 value: 라운드/반올림 수와 같은 해시 복잡도 매개 변수
  • salt: 베이스64처럼 부호화된 소금
  • hash: 패스워드와 솔트 해싱의 base64 유사 인코딩 결과
구성표 ID 스키마
DES Kyq4bCxAXJkbg
_ BSDi _EQ0.jzhSVeUyoSqLupI
1 MD5 $1$etNnh7FA$OlM7eljE/B7F1J4XYNnk81
2, 2a, 2x, 2y 비밀의 $2a$10$VIhIOofSMqgdGlL4wzE//e.77dAQGqntF/1dT7bqCrVtquInWy2qi
3 엔타시 $3$8846f7eaee8fb117ad06bdd830b7586c
5 SHA-256 $5$9ks3nNEqv31FX.F$gdEoLFsCRsn/WRN3wxUnzfeZLoooVlzeF4WjLomTRFD
6 SHA-512 $6$qoE2letU$wWPRl.PVczjzeMVgjiA8LLy2nOyZbf7Amj3qLIL978o18gbMySdKZ7uepq9tmMQXxyTIrS12Pln.2Q/6Xscao0
md5 Solaris MD5 $md5,rounds=5000$GUBv0xjJ$mSwgIswdjlTY0YxV7HBVm0
sah1 SHA-1 포함 PBKDF1 $sha1$40000$jtNX3nZ2$hBNaIXkt4wBI2o5rsi8KejSjNqIq
y 예스크립트 $y$j9T$F5Jx5fExrKuPp53xLKQ..1$X3DX6M94c7o.9agCG9G317fhZg9SqC.5i5rd.RhAtQ7

PHC 부분집합은 MCF 해시의 대부분을 포함한다. 많은 추가 애플리케이션 정의 방법이 존재한다.[3]

암호를 키로 사용하여 원래 구현

제3판 유닉스에서[12] 암호() 라이브러리 함수의[11] 원래 구현은 M-209 암호기를 모방했다. 암호화된 값과 키에서 암호를 복구할 수 있었던 키로 암호를 암호화하기보다는 암호 자체를 키로 사용했고 암호 데이터베이스에는 이 키로 암호를 암호화한 결과가 담겨 있었다.

기존 DES 기반 방식

원래 암호 암호화 방식은 속도가 너무 빠른 것으로 밝혀져 가능성이 가장 높은 암호의 강제 열거 대상이 되었다.[11] 제7판 유닉스에서는, 체계가 DES 알고리즘의 변형된 형태로 변경되었다.[13] 이러한 변화의 목표는 암호화를 더 느리게 만드는 것이었습니다. 또한, 알고리즘은 공격자가 전체 암호 데이터베이스를 동시에 겨냥할 수 있는 것이 아니라 각 암호를 독립적으로 크랙할 것을 보장하기 위해 12비트 솔트를 통합했다.

세부적으로, 사용자의 비밀번호는 8자로 잘리고, 그것들은 각각 7비트로만 강제 압축된다; 이것은 56비트 DES 키를 형성한다. 그런 다음 이 키를 사용하여 모든 비트 영점 블록을 암호화하고, 암호문을 동일한 키로 다시 암호화하여 총 25개의 DES 암호화를 한다. 12비트 솔트는 암호화 알고리즘을 교란시키기 위해 사용되므로 표준 DES 구현은 암호화() 구현에 사용될 수 없다. 소금과 최종 암호문은 base64의 형태로 인쇄 가능한 문자열로 인코딩된다.

이것은 데이터(모든 비트 0)가 비밀로 유지되고 있지 않기 때문에 기술적으로 암호화가 아니다. 사전에 모두에게 널리 알려져 있다. 그러나 DES의 속성 중 하나는 알려진 일반 텍스트 상황에도 불구하고 키 복구에 매우 내성이 있다는 것이다. 이론적으로 서로 다른 두 개의 암호가 정확히 같은 해시를 초래할 수 있다. 따라서 비밀번호는 절대 "해독"되지 않는다. 이것은 단지 결과를 계산하는 데 사용되며, 일치하는 결과는 비밀번호의 "같다"는 증거일 것으로 추정된다.

이 방법의 장점은 해시텍스트를 시스템 관리자나 다른 사용자에게 해당 일반 텍스트 암호를 노출하지 않고 Unix 시스템 간에 저장 및 복사할 수 있다는 것이다. 이러한 이식성은 많은 세대의 컴퓨팅 아키텍처와 많은 공급업체의 많은 버전의 Unix에서 30년 이상작동해 왔다.

전통적인 계획의 약점

기존의 DES 기반 암호 알고리즘은 원래 DES가 "알려진 일반 텍스트" 공격에도 불구하고 키 복구에 내성이 있었고, 계산적으로 비용이 많이 들기 때문에 선택되었다. 초기 Unix 시스템에서는 암호 해시를 계산하는 데 1초가 걸렸다. 이것은 또한 그 시대의 사전 공격에 합리적으로 저항하도록 만들었다. 당시 암호 해시는 일반적으로 계정 파일에 저장되었다(/etc/passwd시스템에 있는 모든 사람이 읽을 수 있는 것. (이 계정 파일은 사용자 ID 번호를 이름으로, 사용자 이름을 전체 이름 등으로 매핑하는 데도 사용되었다.)

그 이후로 30년 동안, 컴퓨터는 훨씬 더 강력해졌다. 무어의 법칙은 일반적으로 사실이기 때문에, 주어진 금융 투자에 이용 가능한 컴퓨터 속도와 용량은 유닉스가 처음 쓰여진 이후 20배 이상 증가했다. 이는 DES 기반 알고리즘을 사전 공격에 취약한 상태로 둔 지 오래되었고, 리눅스 같은 유닉스·유닉스 유사 시스템은 오랫동안 "그림자" 파일을 사용하여 암호 해시 값만 계정 파일 밖으로 마이그레이션했다()./etc/passwd() 및 파일로 (일반적으로 명명됨) /etc/shadow권한 있는 프로세스에서만 읽을 수 있는 )

암호 해독에 따른 계산 비용을 증가시키기 위해 일부 Unix 사이트는 임시로 암호화 라운드 수를 늘리기 시작했다.[citation needed] 이것은 그들을 만드는 부작용이 있었다. crypt() 표준과 양립할 수 없는 crypt(): 해시는 동일한 텍스트 형태를 가지고 있었지만, 지금은 다른 알고리즘을 사용하여 계산되었다. 일부 사이트는 또한 표준 전체비트 제로에서 초기 블록을 수정함으로써 이러한 비호환성 효과를 이용했다.[citation needed] 이것은 해싱 비용을 증가시키지 않았지만, 표준 암호()에 근거한 사전 계산된 해시 사전을 적용할 수 없다는 것을 의미했다.

BSDi 확장 DES 기반 체계

BSDi는 고전적인 DES 기반 계획을 약간 수정했다. BSDi는 소금을 24비트로 확장하고 라운드 수를 변수(최대 2-1개24)로 만들었다. 선택한 라운드의 수는 저장되어 있는 암호 해시에 인코딩되어, 원래 계획에 의해 사용된 라운드 수를 사이트에서 수정할 때 발생한 비호환성을 방지한다. 이러한 해시는 밑줄로 시작하여 식별된다._)) 뒤에 라운드 수를 나타내는 4바이트가 따른다.

BSDi 알고리즘은 또한 DES를 사용하여 초기 긴 암호를 원래 알고리즘이 지원하는 8개의 7비트 바이트로 접는 방식으로 더 긴 암호를 지원한다.

MD5 기반 체계

Poul-Henning KampMD5 메시지 다이제스트 알고리즘을 기반으로 바로크와 (당시) 계산적으로 비싼 알고리즘을 설계했다. MD5 자체는 암호 해시에 대해 좋은 암호 강도를 제공할 수 있지만, 암호 해시가 제공하는 강도에 비해 계산이 상당히 빠르도록 설계되었다. 암호() 계획은 사전 공격을 늦추기 위해 계산 비용이 많이 들도록 고안되었다. 인쇄 가능한 형태의 MD5 암호 해시는 $1$.

이 체계는 사용자가 어떤 길이의 암호를 가질 수 있도록 하며, 플랫폼에서 지원되는 문자도 사용할 수 있다(7비트 ASCII뿐만 아니라). (실제로 많은 구현에서는 암호 길이를 제한하지만 일반적으로 어떤 사람이 입력하려고 하는 것보다 훨씬 오래 암호를 지원한다.) 소금도 임의의 문자열로, 문자 집합 고려사항에 의해서만 제한된다.

먼저 암호와 소금을 해시하여 MD5 메시지 다이제스트를 생성한다. 그리고 나서 새로운 다이제스트가 만들어지며, 암호문, 소금, 그리고 첫 번째 다이제스트 모두 다소 복잡한 형태로 되어 있다. 그리고 나서 이 소화는 회진마다 다른 방식으로 암호와 소금과 함께 그것을 재시하는 기능의 수천 번 반복을 통해 전달된다. 이 라운드들 중 마지막 라운드의 출력은 결과 암호 구문 해시이다.

고정된 반복 횟수로 인해 이 계획은 한때 즐겼던 계산 비용을 잃게 되었고, 이제 다양한 라운드의 수가 선호된다. 2012년 6월, Poul-Henning Kamp는 알고리즘이 불안정하다고 선언하고 사용자들에게 더 강력한 암호 스크램블러로 이동하도록 권장했다.[14]

복어 기반 구조

Niels ProvosDavid MazieresBlowfish를 기반으로 bcrypt라고 불리는 암호() 계획을 설계하였고, 1999년에 USENIX에서 그것을 발표했다.[15] 이 해시의 인쇄 가능한 형태는 $2$, $2a$, $2b$, $2x$ 또는 $2y$ 사용되는 알고리즘의 변종에 따라:

  • $2$ – 구식.
  • $2a$ – 이 계획을 식별하는 데 사용되는 현재 키. 2011년 알고리즘의 비OpenBSD crypt_blowfish 구현에서 주요 보안 결함이 발견되었기 때문에 이 문자열로 표시된 해시는 현재 모호하며 결함 구현 또는 후속 고정 구현에 의해 생성되었을 수 있다.[16] 이 결함은 ASCII가 아닌(8비트 집합) 문자가 포함된 일부 암호 문자열로 인해 트리거될 수 있다.
  • $2b$ – 최근 OpenB에서 사용포괄적 문제에 대한 완화를 포함하기 위한 SD 구현.[17] 이전 버전의 알고리즘은 긴 암호에 문제가 있다. 설계상 긴 비밀번호는 72자로 잘려나 특정 비밀번호 길이의 바이트 정수 줄바꿈 문제가 있어 해시가 약하다.[18]
  • $2x$crypt_blowfish 버그 발견 후 추가된 플래그. 오래된 해시의 이름은 다음으로 바꿀 수 있다. $2x$ 고장난 알고리즘으로 생성되었다는 것을 나타내기 위해서입니다. 이 해시는 아직 약하지만, 적어도 어떤 알고리즘을 사용하여 해시를 생성했는지는 확실하다.
  • $2y$ – 새로운 보정 알고리즘을 모호하게 사용하는 crypt_blowfish의 플래그. 버그에 시달리는 오래된 구현에서는 $2y$ 도저히 먹혀들지 않는다 보다 새롭고 고정된 구현에서, 그것은 사용과 동일한 결과를 산출할 것이다. $2b$.

복어는 값비싼 키 설정 단계로 블록 암호 중 눈에 띈다. 표준 상태의 하위 키로 시작한 다음, 이 상태를 사용하여 키의 일부를 사용하여 블록 암호화를 수행하고, 암호화의 결과(실제로 해싱)를 사용하여 일부 하위 키를 대체한다. 그런 다음 이 수정된 상태를 사용하여 키의 다른 부분을 암호화하고 결과를 사용하여 더 많은 하위 키를 대체한다. 모든 하위 키가 설정될 때까지 키를 해시하고 상태 비트를 교체하기 위해 점진적으로 수정된 상태를 사용하여 이 방식으로 진행한다.

키잉 라운드의 수는 알고리즘 입력인 2의 힘이다. 숫자는 텍스트 해시로 인코딩된다(예: $2y$10...

NT 해시 구성표

FreeBSD는 MS-CHAP를 통해 NT 계정과의 호환성을 보다 쉽게 제공하기 위해 NT LAN Manager 해시 알고리즘에 대한 지원을 구현했다.[19] NT-해시 알고리즘은 염장 없이 사용되지 않는 md4 해시 알고리즘을 사용하기 때문에 약한 것으로 알려져 있다.[20] FreeBSD는 $3$ 이것의 접두사 깨지기 쉬우므로 사용을 권장하지 않는다.[1]

SHA2 기반 구조

일반적으로 사용되는 MD5 기반 계획은 컴퓨터 파워가 증가함에 따라 공격하기가 쉬워졌다. Blowfish 기반 시스템은 라운드를 추가할 수 있는 옵션을 가지고 있어 어려운 암호 알고리즘으로 남아 있지만 NIST가 승인한 알고리즘은 사용하지 않는다. 이러한 사실에 비추어, 레드햇울리히 드레퍼SHA-2(SHA-256, SHA-512) 해시함수에 기초한 계략을 만드는 노력을 주도하였다.[21] 이 해시의 인쇄 가능한 형태는 $5$ (SHA-256) 또는 $6$ (SHA-512의 경우) 사용되는 SHA 변종에 따라 달라진다. 설계는 MD5 기반 암호와 유사하며 몇 가지 주목할 만한 차이점이 있다.[21]

  • 몇 단계로 상수 데이터를 추가하는 것을 피한다.
  • MD5 알고리즘은 암호의 첫 글자를 반복해서 추가하게 되는데,[citation needed] 이 단계가 크게 변경되었다.
  • Sun의 암호() 구현에서 영감을 받아 알고리즘의 메인 루프가 수행하는 반복 횟수(원형)를 지정하는 기능이 추가되었다[22][23].
  • 반복 횟수는 기본적으로 5000회로, 최소 1000회, 최대 999,999회이다.[24]

규격과 샘플 코드는 공개 영역으로 공개되었다. 종종 "SHAcrypt"[24]라고 불린다.

다른 해시

$y$
yescrypt스크립트(7달러)와 PHC 결승전의 연장선이다. 그것은 기존의 계획에 대한 대안으로 몇몇 Linux 배포에서 사용된다.[25] 이 해시를 사용하려면 libcrypt glibc는 "libxcrypt" 프로젝트에서 역방향으로 대체된다.[26]
$argon2d$, $argon2i$, $argon2ds$
이들은 아르곤2 알고리즘에 대해 PHC가 할당한 이름들이지만 널리 쓰이지는 않은 것으로 보인다.

추가 형식(있는 경우)은 맨페이지의 구현에 설명되어 있다.[27]

고대 유닉스 제도

BigCrypt는 HP-UX, Digital Unix, OSF/1에서 사용되는 DES-Crypt의 변형판이다. 그것과 DES의 주요 차이점은 빅크립트가 처음 8개만이 아닌 암호의 모든 문자를 사용하며 가변 길이 해시를 가지고 있다는 점이다.[28]

Crypt16은 DES의 사소한 수정으로, 최대 16자까지 암호가 허용된다. Ultrix [29]및 Tru64에 사용됨

운영 체제 지원

구성표 ID 계략 Linux(glibc) 자유BSD 넷BSD 오픈BSD 솔라리스 매코스
DES
_ BSDi 아니요. 아니요.
1 MD5 아니요.
2, 2a, 2x, 2y 비밀의 아니요. 아니요.
3 엔타시 아니요. 아니요. 아니요. 아니요. 아니요.
5 SHA-256 2.7+ 8.3+ 아니요. 아니요. 아니요.
6 SHA-512 2.7+ 8.3+ 아니요. 아니요. 아니요.
md5 Solaris MD5 아니요. 아니요. 아니요. 아니요. 아니요.
sah1 SHA1 포함 PBKDF1 아니요. 아니요. 아니요. 아니요. 아니요.

리눅스

거의 모든 Linux 배포에 사용되는 GNU C 라이브러리는 위에서 언급한 해싱 알고리즘을 기반으로 DES, MD5 및 (버전 2.7 이후) SHA-2를 지원하는 암호화 기능의 구현을 제공한다. glibc 유지 관리자인 Ulrich Drepper는 NIST의 승인을 받지 못했기 때문에 bcrypt (scheme 2) 지원을 거절했다.[30] 공용 도메인 crypt_blowfish 라이브러리는 비밀번호가 없는 시스템에 사용할 수 있다. SUSE 리눅스의 glibc에 통합됐다.[31] 또한 앞서 언급한 libxcrypt는 yescrypt 지원 시스템의 glibc crypt()를 대체하는 데 사용된다.

Musl C 도서관은 체계 1, 2, 5, 6과 더불어 전통적인 DES 체계를 지원한다. 기존의 DES 코드는 BSD FreeSec에 기반하며, glibc UFC-Crypt와 호환되도록 수정한다.[32]

마코스

다윈의 고향 crypt() 제한된 기능을 제공하며, DES와 BSDi만 지원한다. OS X는 기존의 NeXTStep netinfo에서 새로운 디렉토리 서비스(ds) 시스템에 이르는 자체 암호 해시에 대해 몇 개의 시스템을 사용한다.[33][34]

참고 항목

참조

  1. ^ a b crypt(3)FreeBSD 라이브러리 기능 설명서
  2. ^ 심슨 가핀켈, 앨런 슈워츠, 진 스파포드. "실용 유닉스 & 인터넷 보안". 2003. 섹션 "4.3.2.3 암호화16( ), DES 확장 모듈식 암호화 형식". "MCF(Modular Crypt Format)는 암호화된 암호를 포맷하기 위한 확장 가능한 체계를 규정한다. MCF는 암호화된 암호에 가장 많이 사용되는 형식 중 하나"
  3. ^ a b c d "Modular Crypt Format — Passlib v1.7.1 Documentation". Pythonhosted.org. Retrieved 2 December 2018.
  4. ^ "ademarre/binary-mcf". GitHub.com. Retrieved 2 December 2018.
  5. ^ "crypt - perldoc.perl.org". Perldoc.perl.org. Retrieved 2 December 2018.
  6. ^ "PHP: crypt - Manual". Us.php.net. Retrieved 2 December 2018.
  7. ^ "crypt()". Archived from the original on 2012-10-02. Retrieved 2013-02-09.
  8. ^ "crypt — Function to check Unix passwords — Python 3.7.1 documentation". Docs.python.org. Retrieved 2 December 2018.
  9. ^ "Class: String (Ruby 2.5.3)". Ruby-doc.org. Retrieved 2 December 2018.
  10. ^ Password Hash Competition. "PHC string format". Github.
  11. ^ a b Morris, Robert; Thompson, Ken (1978-04-03). "Password Security: A Case History". Bell Laboratories. Retrieved 2013-12-17.
  12. ^ "crypt – password encoding". UNIX Third Edition Programmers' Manual. 1973-01-15.
  13. ^ "crypt, setkey, encrypt – DES encryption". UNIX Seventh Edition Programmers' Manual. 1979.
  14. ^ "Md5crypt Password scrambler is no longer considered safe by author — PHKs Bikeshed". Phk.freebsd.dk. Archived from the original on 17 March 2018. Retrieved 2 December 2018.
  15. ^ Provos, Niels; Mazières, David (1999). "A Future-Adaptable Password Scheme". Proceedings of 1999 USENIX Annual Technical Conference: 81–92.
  16. ^ Designer, Solar (2011-06-21). "crypt_blowfish 1.1; Owl glibc security update". CVE-2011-2483을 참조하십시오.
  17. ^ "src/lib/libc/crypt/bcrypt.c – view – 1.27". Cvsweb.openbsd.org. Retrieved 2016-05-14.
  18. ^ Designer, Solar (2012-01-02). "OpenBSD bcrypt 8-bit key_len wraparound".
  19. ^ "NT MD4 password hash as new password encryption method for FreeBSD". Mail-archive.com. Retrieved 2 December 2018.
  20. ^ "The NTLM Authentication Protocol and Security Support Provider". Davenport.sourceforge.net. Retrieved 2 December 2018.
  21. ^ a b Drepper, Ulrich (19 September 2007). "Unix crypt with SHA-256/512". Retrieved 21 November 2018.
  22. ^ Sun Microsystems. "crypt_sunmd5(5) man page". Archived from the original on 2008-04-16. Retrieved 2008-03-05.
  23. ^ Muffett, Alec (2005-12-05). "OpenSolaris, Pluggable Crypt, and the SunMD5 Password Hash Algorithm". Retrieved 2012-08-11.
  24. ^ a b Drepper, Ulrich. "Unix crypt using SHA-256 and SHA-512".
  25. ^ "FESCo Says "Yes" To Fedora 35 Using Yescrypt For Hashing Shadow Passwords - Phoronix". www.phoronix.com.
  26. ^ "Changes/yescrypt as default hashing method for shadow - Fedora Project Wiki". libxcrypt: Is already capable for computing yescrypt hashes since v4.3.
  27. ^
  28. ^ "passlib.hash.bigcrypt - BigCrypt — Passlib v1.7.1 Documentation". Pythonhosted.org. Retrieved 2 December 2018.
  29. ^ "passlib.hash.crypt16 - Crypt16 — Passlib v1.7.1 Documentation". Pythonhosted.org. Retrieved 2 December 2018.
  30. ^ "bcrypt support for passwords in /etc/shadow - Red Hat Customer Portal". Access.redhat.com. Retrieved 2 December 2018.
  31. ^ "bcrypt password hashing ("password encryption") for your software and your servers". www.openwall.com.
  32. ^ "crypt_r.c\crypt\src - musl - musl - an implementation of the standard library for Linux-based systems". git.musl-libc.org.
  33. ^ "How Mac OS X Implements Password Authentication". Dribin.org. Retrieved 2 December 2018.
  34. ^ "How to crack Mac OS X Passwords - Online Hash Crack". Onlinehashcrack.com. Retrieved 2 December 2018.

외부 링크