Secure Remote Password 프로토콜

Secure Remote Password protocol

SRP(Secure Remote Password Protocol)는 기존 [1]특허에 대응하도록 특별히 설계된 PAKE(암호 인증교환) 프로토콜입니다.

모든 PAKE 프로토콜과 마찬가지로, 도청자나 중간에 있는 사람은 각 추측에 대해 당사자들과 더 이상의 상호 작용 없이 암호를 추측하거나 사전 공격을 적용할 수 있는 충분한 정보를 얻을 수 없습니다.또한 서버는 증강 PAKE 프로토콜이므로 암호와 동등한 [2]데이터를 저장하지 않습니다.즉, 서버 데이터를 도용하는 공격자는 패스워드에 대한 무차별적인 검색을 먼저 수행하지 않으면 클라이언트로 위장할 수 없습니다.

문외한의 관점에서 보면, SRP(또는 다른 PAKE 프로토콜) 인증중에, 패스워드 자체나 패스워드를 취득할 수 있는 그 외의 정보를 송신하지 않고, 한쪽(「클라이언트」또는 「사용자」)이 다른 쪽(「서버」)에게 패스워드를 알고 있는 것을 나타냅니다.패스워드는 클라이언트에서 전송되지 않으며 서버에서 알 수 없습니다.

게다가 서버는, 시큐어인 접속을 개시하기 위해서 패스워드에 대해서도 알고 있을 필요가 있습니다(패스워드 자체는 알고 있지 않습니다).즉, 서버는 클라이언트에 대해서도 자신을 인증하므로 사용자의 복잡한 URL 해석에 의존하지 않고 피싱을 방지할 수 있습니다.

새로운 대체 알고리즘에는 AuCPace 및 OPAQ가 포함됩니다[3].UE[4] [5]

개요

SRP 프로토콜에는 사용자가 서버에 대해 자신을 인증할 수 있고, 도청자에 의해 실행되는 사전 공격에 대한 내성이 있으며, 신뢰할 수 있는 서드파티가 필요하지 않습니다.사용자로부터 서버에 제로 지식 패스워드의 증명을 효과적으로 전달합니다.프로토콜 개정판 6에서는 연결 시도당 하나의 암호만 추측할 수 있습니다.프로토콜의 흥미로운 속성 중 하나는 사용하는 암호화 프리미티브 중 한두 개가 공격을 받아도 여전히 안전하다는 것입니다.SRP 프로토콜은 여러 번 개정되었으며 현재 개정 6a에 있습니다.

SRP 프로토콜은 Diffie와 유사한 방식으로 두 당사자 간에 공유되는 큰 개인 키를 생성합니다.Hellman 키 교환은 사용자 패스워드를 가진 클라이언트 측과 패스워드에서 파생된 암호화 검증자를 가진 서버 측에 기초한다.공유 공용 키는 로그인 시행에 고유한2개의 랜덤 번호(클라이언트에 의해 생성된 번호와 서버에 의해 생성된 번호)에서 파생됩니다.암호화된 통신과 인증이 필요한 경우 SRP 프로토콜은 대체 SSH 프로토콜보다 안전하고 Diffie를 사용하는 것보다 더 빠릅니다.서명된 메시지와 헬만 키를 교환해 주세요Kerberos와는 달리 서드파티로부터도 독립되어 있습니다.SRP 프로토콜 버전 3은 RFC 2945에 설명되어 있습니다.SRP 버전6은 SSL/TLS(TLS-SRP 내) 및 EAP[7]SAML 등의 기타 표준에서의 강력한 패스워드 인증에도 사용되며 IEEE P1363 및 ISO/IEC 11770-4에서 표준화되고 있습니다.

프로토콜

이 프로토콜 설명인 버전 6에서는 다음 표기법이 사용됩니다.

  • q와 N = 2q + 1은 둘 다 소수(q는 소피 제르맹 소수와 N은 안전소수)가 되도록 선택된다.N은 이산 로그 모듈로 N을 계산할 수 없도록 충분히 커야 합니다.
  • 모든 연산은 정수 모듈로 N, 링에서 수행됩니다.즉, 아래 gx gmodx N으로 읽어야 합니다.
  • g곱셈 N {\ \ 생성자입니다.
  • H()는 해시 함수입니다(예: SHA-256).
  • k는 양쪽에서 도출된 매개변수이다. SRP-6에서는 k = 3인 반면, SRP-6a에서는 N g : k = H(N, g)에서 도출된다.액티브 공격자가 서버를 [8][9]가장할 때 2대1 추측을 방지하기 위해 사용됩니다.
  • s작은 소금입니다.
  • 는 식별 사용자 이름입니다.
  • p는 사용자의 패스워드입니다.
  • v는 호스트의 암호 확인자 v = g이며x, 여기서 최소 x = H(s, p)입니다.x는 클라이언트에서만 계산되므로 보다 강력한 알고리즘을 자유롭게 선택할 수 있습니다.구현에서는 호스트에 필요한 단계에 영향을 주지 않고 x = H(s IP)사용하도록 선택할 수 있습니다.표준 RFC 2945는 x = H(s H)( ": p")를 정의하고 있습니다.x 에서 I를 사용하면 두 사용자가 동일한 비밀번호를 공유하는 경우 악의적인 서버가 학습할 수 없습니다.
  • A와 B는 각각 사용자와 호스트의 랜덤 1회 사용 후 삭제 키입니다.
  • (파이프)는 연결을 나타냅니다.

다른 모든 변수는 이러한 관점에서 정의됩니다.

먼저 서버 Steve와 비밀번호 p를 설정하기 위해 클라이언트 Carol은 소량의 랜덤 솔트를 선택하여 x = H(s, p), v = gx 계산합니다.Steve는 I에 의해 색인화된 v와 s를 Carol의 비밀번호 확인자와 salt로 저장합니다.Carol은 x를 다른 사람과 공유해서는 안 되며, 이 단계에서 x를 안전하게 삭제해야 합니다.이는 보통 텍스트 비밀번호 p와 같기 때문입니다.이 단계는 시스템을 Steve 사용자 등록의 일부로 사용하기 전에 완료됩니다.솔트는 공유 및 교환되어 세션키를 나중에 네고시에이트 할 수 있도록 하기 위해 어느 한쪽에서 값을 선택할 수 있지만 Carol은 I, s v를 단일 등록 요구에 등록할 수 있도록 합니다.등록 요구의 송신 및 인증은 SRP에서는 취급하지 않습니다.

그런 다음 나중에 암호 증명을 수행하기 위해 다음과 같은 교환 프로토콜이 발생합니다.

  1. Carol → Steve: 랜덤 a 생성; I 및 A = ga 전송
  2. Steve → Carol: 랜덤 b 생성; s B = kv + gb
  3. 다: u = H(A, B)
  4. 캐롤: SCarol = (B - kgx)(a + ux) = (표준 + gb - kgx)(a + ux) = (kgx - kgx + (a + ux)gb) = (gb)(a + ux)
  5. 캐롤: KCarol = H(SCarol)
  6. 스티브: SSteve = (Avu)b = (gvau)b = [ga(gx)]ub = (ga + ux)b = (gb)(a + ux)
  7. 스티브Steve: K = H(SSteve) = KCarol

이제 두 당사자는 공유되고 강력한 세션 키 K를 갖게 되었습니다.인증을 완료하려면 서로 키가 일치함을 증명해야 합니다.생각할 수 있는 한 가지 방법은 다음과 같습니다.

  1. 캐롤 → 스티브1: M = H[H(N) XOR H(g) H(I) s A B KCarol.Steve가 M을 확인합니다1.
  2. Steve → Carol: M2 = H(A1Steve M K).캐롤은 M을 검증한다2.

이 방법에서는 키뿐만 아니라 더 많은 공유 상태를 가장하여 성공시켜야 합니다.대부분의 추가 상태는 공개이지만 서버 개인 [clarification needed]키와 같이 해시 함수에 대한 입력에 개인 정보를 안전하게 추가할 수 있습니다.

또는 패스워드만의 증명에서는 K의 계산을 생략하고 공유S를 다음과 같이 증명할 수 있습니다.

  1. 캐롤 → 스티브: M1 = H(ACarol B S).Steve가 M을 확인합니다1.
  2. Steve → Carol: M2 = H(A1Steve M S).캐롤은 M을 검증한다2.

SRP를 사용하여 네고시에이션 직후에 사용되는 공유키 K를 네고시에이트 할 때, M2 M의 검증1 순서를 건너뛸 수 있습니다.서버는 복호화할 수 없는 클라이언트의 첫 번째 요구를 거부합니다.확인 단계를 건너뛰는 [citation needed]것은 위험할 수 있습니다.

양 당사자는 또한 다음과 같은 안전장치를 사용한다.

  1. B = 0(mod N) 또는 u =0을 수신하면 Carol은 중단됩니다.
  2. A(mod N) = 0을 받으면 Steve가 중단됩니다.
  3. 캐롤은 K(또는 S)의 증거를 먼저 보여줘야 한다.Steve는 Carol의 증거가 올바르지 않음을 발견하면 K(또는 S)의 증거를 제시하지 않고 중단해야 합니다.

Python의 코드 예시

#!/usr/bin/env ipython3-m IPython.lib.demo ---C """ SRP 인증의 예  경고: 테스트 이외의 실제 암호화 목적으로 사용하지 마십시오. 경고: 아래 코드는 중요한 세이프가드를 놓치고 있습니다.A, B, U가 제로가 아닌지는 확인하지 않습니다.  http://srp.stanford.edu/design.html를 기반으로 합니다. """ 수입품 해시리브 수입품 랜덤  주의: str은 그대로 변환되며 str([1, 2, 3, 4])은 [1, 2, 3, 4]로 변환됩니다. 방어하다 H(*args) -> 인트:     단방향 해시함수."""     a = ":".합류하다(스트레이트(a) 위해서 a  args)     돌아가다 인트(해시리브.sha256(a.부호화('utf-8')).16진수(), 16)  방어하다 암호(n: 인트 = 1024):     돌아가다 랜덤.시스템 랜덤().랜덤 비트(n) % N  # 큰 안전 소수(N = 2q+1, 여기서 q는 소수) # 모든 산술은 모듈로 N에 맞춰져 있어 # ("sl dhparam - text 1024"를 사용하여 생성) N = "00:c0:37:c3:75:88:b4:32:98:87:e6:1c:2d:a3:32: 4b:1b:a4:b8:1a:63:f9:74:8f:ed:2d:8a:41:0c:2f: c2:1b:12:32:f0:d3:bf:a0:24:27:6c:c:f2:88:44:81: 97:aa:e4:86:a6:3b:fc:a7:b8:bf:77:54:df:b3:27: c7:20:1f:6f:d1:7f:d7:d7:180:74:15:8b:d3:1c:e7:72: c9:f5:f8:ab:58:45:48:a9:9a:75:9b:5a:2c:05:32: 16:2b:7b:62:18:e8:f1:42:bc:e2:c3:0d:77:84:68: 9a:48:3e:09:5e:70:16:18:43:79:13:a8:c3:9c:3d:"       N = 인트("".합류하다(N.분열되다()).교체하다(":", ""), 16) g = 2  # 발전기 모듈 N  k = H(N, g) # 승수 파라미터(기존 SRP-6에서는 k=3)  F = '#0x' # 형식 지정자  인쇄물("#. H, N, g, k는 클라이언트와 서버 양쪽에 미리 알려져 있습니다.") 인쇄물(f'{H = }\n{N = :{F}}\n{g = :{F}}\n{k = :{F}}')  인쇄물("\n0. 비밀번호 데이터베이스에 저장된 서버(I, s, v))  # 서버는 먼저 패스워드 검증자를 생성해야 합니다. I = '사람'        사용자 이름 p = "패스워드 1234"  패스워드 s = 암호(64)   # 사용자를 위한 소금 x = H(s, I, p)      # 개인 키 v = 전원(g, x, N)    # 비밀번호 확인자  인쇄물(f'{I = }\n{p = }\n{s = :{F}}\n{x = :{F}}\n{v = :{F}}')  # <timeout> ---정지 ---  인쇄물("\n1. 클라이언트는 사용자 이름 I과 퍼블릭 ephemeral 값 A를 서버에 송신합니다.) a = 암호() A = 전원(g, a, N) 인쇄물(f"{I = }\n{A = :{F}}")  # 클라이언트 -> 서버 (I, A)  # <timeout> ---정지 ---  인쇄물("\n2. 서버는 사용자의 솔트값과 퍼블릭 에페머럴값 B를 클라이언트에 송신합니다.) b = 암호() B = (k * v + 전원(g, b, N)) % N 인쇄물(f"{s = :{F}}\n{B = :{F}}")  # 서버 -> 클라이언트 (s, B)  # <timeout> ---정지 ---  인쇄물("\n3. 클라이언트와 서버는 랜덤 스크램블링 파라미터를 계산합니다.) u = H(A, B)  # 랜덤 스크램블링 파라미터 인쇄물(f"{u = :{F}}")  # <timeout> ---정지 ---  인쇄물("\n4. 클라이언트는 세션 키를 계산한다.) x = H(s, I, p) S_c = 전원(B - k * 전원(g, x, N), a + u * x, N) K_c = H(S_c) 인쇄물(f"{S_c = :{F}}\n{K_c = :{F}}")  # <timeout> ---정지 ---  인쇄물("\n5. 서버가 세션 키를 계산합니다.) S_s = 전원(A * 전원(v, u, N), b, N) K_s = H(S_s) 인쇄물(f"{S_s = :{F}}\n{K_s = :{F}}")  # <timeout> ---정지 ---  인쇄물("\n6. 클라이언트는 세션 증명 키를 서버에 송신합니다.) M_c = H(H(N) ^ H(g), H(I), s, A, B, K_c) 인쇄물(f"{M_c = :{F}}") # client - > server ( M _ c );서버가 M_c를 확인합니다.  # <timeout> ---정지 ---  인쇄물("\n7. 서버에서 세션 증명 키를 클라이언트에 송신합니다.) M_s = H(A, M_c, K_s) 인쇄물(f"{M_s = :{F}}") # server - > client ( M _ s );클라이언트는 M_s를 확인합니다. 

실장

  • SRP-6 변수 SRP-6 프로토콜을 구현하기 위해 필요한 암호화 프리미티브의 Java 라이브러리.
  • OpenSSL 버전 1.0.1 이후.
  • Botan(C++ 암호화 라이브러리)에는 SRP-6a 구현이 포함되어 있습니다.
  • TLS-SRP는 SRP를 사용하는 트랜스포트층 보안용 암호 스위트 세트입니다.
  • 자바스크립트에서의 srp-client SRP-6a 구현(RFC 5054와 호환), 오픈소스, Mozilla Public License(MPL; 모질라 퍼블릭 라이선스) 라이선스.
  • JavaScript Crypt Library에는 SRP 프로토콜, 오픈 소스, BSD 라이선스의 JavaScript 구현이 포함되어 있습니다.
  • Gnu CryptoGNU General Public License에 따라 라이선스가 부여된 Java 구현을 "라이브러리 예외"와 함께 제공하며, 이를 통해 비 Free 소프트웨어와 함께 라이브러리로 사용할 수 있습니다.
  • Legion of the Bouncy Castle은 MIT 라이선스에 따라 Java 및 C# 구현을 제공합니다.
  • Nimbus SRP는 검증 생성기, 클라이언트 및 서버 측 세션을 제공하는 Java 라이브러리입니다.사용자 정의 암호 키, 클라이언트 및 서버 증거 메시지 루틴을 위한 인터페이스를 포함합니다.외부 의존관계는 없습니다.Apache 2.0 라이선스로 출시됩니다.
  • srplibcppMIRACL에 기반한 C++ 구현 기반입니다.
  • Dragon SRP는 현재 OpenSSL에서 동작하는 C++ 모듈러 구현입니다.
  • Json2Ldap은 LDAP 디렉토리 서버에 SRP-6a 인증을 제공합니다.
  • C에서의 csrp SRP-6a 실장.
  • Perl에서의 Crypt-SRP SRP-6a 실장.
  • Python에서의 pysrp SRP-6a 실장(csrp와 호환).
  • py3srp SRP-6a를 Python3에 구현합니다.
  • srptools Python에서 SRP(Secure Remote Password) 인증을 구현하기 위한 도구입니다.호환성이 있는 라이브러리를 확인.
  • Meteor Web 프레임워크의 Accounts 시스템은 패스워드 인증을 위한 SRP를 구현합니다.
  • srp-rb SRP-6a 실장.
  • FalkmuellerMIT 라이센스에 따라 JavaScript PHP에서 스탠포드 SRP-6a를 구현SRP-6a 데모입니다.
  • PHP 및 JavaScript에서의 srp-6a-demo SRP-6a 구현.
  • JavaScript에서의 thinbus-srp-js SRP-6a 구현.Spring Security를 사용한 데모 앱인 Nimbus SRP를 사용하는 호환 Java 클래스가 포함되어 있습니다.PHP 서버에 대한 인증을 수행하는 데모 애플리케이션도 있습니다.Apache 라이선스로 출시되었습니다.
  • Stanford JavaScript Crypt Library(SJCL)는 키 교환을 위해 SRP를 구현합니다.
  • node-srp는 SRP의 JavaScript 클라이언트 및 서버(node.js) 구현입니다.
  • C# 및 Java에서의 C# Java 실장용 SRP6.
  • ALOSRPAuth는 SRP-6a의 Objective-C 구현입니다.
  • go-srp는 SRP-6a의 Go 실장입니다.
  • tssrp6a는 SRP-6a의 TypeScript 구현입니다.
  • IceNet Cryptography Java 라이브러리.암호화 기반의 Spring Boot 애플리케이션을 개발합니다.SRP-6a를 실장합니다.Apache License 아래.
  • 의 SRP-6aSRP-6a의 NET 실장
  • Apple Homekit Apple Homekit은 "스마트" 홈 악세사리 및 디바이스와 페어링할 때 SRP를 사용합니다.
  • 이메일 암호화를 위한 ProtonMail 인증
  • SRP는 Postement에서 사용자를 인증하기 위해 사용되는 SRP의 Go 구현입니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "What is SRP?". Stanford University.
  2. ^ Sherman, Alan T.; Lanus, Erin; Liskov, Moses; Zieglar, Edward; Chang, Richard; Golaszewski, Enis; Wnuk-Fink, Ryan; Bonyadi, Cyrus J.; Yaksetig, Mario (2020), Nigam, Vivek; Ban Kirigin, Tajana; Talcott, Carolyn; Guttman, Joshua (eds.), "Formal Methods Analysis of the Secure Remote Password Protocol", Logic, Language, and Security: Essays Dedicated to Andre Scedrov on the Occasion of His 65th Birthday, Lecture Notes in Computer Science, Cham: Springer International Publishing, pp. 103–126, arXiv:2003.07421, doi:10.1007/978-3-030-62077-6_9, ISBN 978-3-030-62077-6, retrieved 2020-12-02
  3. ^ "AuCPace, an augmented PAKE".
  4. ^ "Should you use SRP?".
  5. ^ "OPAQUE: An Asymmetric PAKE ProtocolSecure Against Pre-Computation Attacks" (PDF).
  6. ^ Taylor, David; Tom Wu; Nikos Mavrogiannopoulos; Trevor Perrin (November 2007). "Using the Secure Remote Password (SRP) Protocol for TLS Authentication". RFC 5054
  7. ^ Carlson, James; Bernard Aboba; Henry Haverinen (July 2001). "EAP SRP-SHA1 Authentication Protocol". IETF. 드래프트
  8. ^ Wu, Tom (October 29, 2002). "SRP-6: Improvements and Refinements to the Secure Remote Password Protocol".
  9. ^ "SRP Protocol Design".

외부 링크

  • 공식 웹사이트
  • SRP 라이선스: B오픈소스와 같은 SD
  • US6539479 - SRP 특허(2015년 5월 12일 유지 보수료 미납으로 만료)(Google 특허에 의거).원래 2018년 7월에 만료될 예정입니다.)

수동 페이지

RFC

  • RFC 2944 - Telnet 인증: SRP
  • RFC 2945 - SRP 인증 및 키 교환 시스템 (버전 3)
  • RFC 3720 - 인터넷 소형 컴퓨터 시스템 인터페이스(iSCSI)
  • RFC 3723 - IP를 통한 블록 스토리지 프로토콜 보호
  • RFC 3669 - 지적재산권 문제에 관한 작업그룹 가이드라인
  • RFC 5054 - TLS 인증을 위한 Secure Remote Password(SRP) 프로토콜 사용

기타 링크