문제

첫째,context:나를 만들려고 명령줄 기반 도구(Linux)는 로그인이 필요합니다.계정에 이 도구를 함께 할 수 없 시스템 수준의 계정 없이에서 보이는/etc/passwd.

내 계획을 저장하는 사용자 계정에서 텍스트 파일을 사용하여 동일한 형식(대략)as/etc/passwd.

지에도 불구하고 시스템을 사용하여 암호파일을 사용하여,토굴을 보였 을 사용하는 것이 좋습 반대로 암호를 저장하기에 일반 텍스트.(동굴은보다 확실히 더 나은 암호를 저장하기에 일반 텍스트,내가 열리는 다른 방법이 있습니다.)

나의 crypt 지식을 기반으로 이:https://docs.python.org/2/library/crypt.html

문서를 보인을 요청하지 않는 무언가 가능:"it 를 사용하는 것이 좋 전체 암호화하는 암호로 소금을 때 확인 에 대한 암호를 입력합니다."

Huh?내가 만드는 암호화하는 암호(으로서,만들 때 사용자 기록)방법을 사용할 수 있습니 암호화하는 암호로 salt?그 아직 존재하지 않습니다.(나는 가정하면 사용해야 하는 같은 소금을 만들고 암호를 확인하기.)

나는 시도를 사용하여 암호를 일반 텍스트로 소금이다.이 일했지만,두 가지 문제점;하나는 쉽게 극복,하나는 심각한:

1)첫번째 두 글자의 암호를 일반 텍스트에 포함됩 암호화하는 암호.이 문제를 해결할 수 있습니에 의해 쓰지 않는 첫 번째 두 개의 파:

user_record = '%s:%s:%s' % (user_name, crypted_pw[2:], user_type)

2)사용하여 암호를 일반 텍스트로 소금을 것 같다 의 양을 줄이는 엔트로피 시스템입니다.아마도 나 오해의 목적은 소금입니다.

최고 연습할 수 있었던 파생 사용하는 것이 먼저 두 개의 문자에서 사용자 이름으로 소금이다.이는 적절, 또는 뭔가가 나가게 만드는 것이 나쁜 이동하는가?

나의 이해의 소금은 그것을 방지 미리 컴퓨팅 비밀번호 해시에서는 사전.사용할 수 있는 표준에 대한 모든 암호(와 같은 나의 이니셜,"JS")하지만 하는 것 같다 덜 부담에 대한 공격보다는 두 개의 문자를 사용에서 각 사용자의 사용자 이름을 사용합니다.

도움이 되었습니까?

해결책

의 사용에 대한 crypt 모듈:

생성할 때는 암호를 암호화하지,당신을 제공합니다.그것은 있을 뿐만 아니라 무작위 증가하는 저항을 무차별을 강제로 그것은 충족된 조건입니다.을 확인할 때는 암호를 제공해야 하는 값에서 getpwname,경우에 당신은 당신이 지원하는 시스템에서는 더 큰 소금과 크기를 생성하지 않았습니다.

일반적인 의견:

이는 아무것도 할 w/로그인 실제 시스템,당신을 막는 아무것도 사용하기에서 강한 방법보다 crypt.할 수 있는 임의로 생성 N 자의 당 사용자가 소금,결합으로 사용자의 암호를 SHA-1 해시입니다.

string_to_hash = user.stored_salt + entered_password
successful_login = (sha1(string_to_hash) == user.stored_password_hash)

업데이트:이것은 훨씬 더 보안에 대한 무지개 테이블,위의 방법이 여전히 암호화 약점이 있습니다.올바른 응용 프로그램의 HMAC 할 수 있습니다 알고리즘은 아직 더 보안을 증가하지만,넘어 영역의 전문 기술입니다.

다른 팁

Python 's Crypt ()는 시스템의 crypt () 함수를위한 래퍼입니다. Linux Crypt () Man Page :

char *crypt(const char *key, const char *salt);

key is a user’s typed password.
salt is a two-character string chosen from the set [a–zA–Z0–9./]. 
This string is used to perturb the algorithm in one of 4096 
different ways.

강조가 "2 자 문자열 ". 이제 Python에서 crypt ()의 동작을 보면 :

>>> crypt.crypt("Hello", "World")
'Wo5pEi/H5/mxU'
>>> crypt.crypt("Hello", "ABCDE")
'AB/uOsC7P93EI'

결과의 처음 두 문자는 원래 소금의 처음 두 문자와 항상 일치하는 것으로 나타났습니다. 즉, crypt ()의 결과는 2CHAR-SALT + 암호화 패스 형식을 갖습니다. 따라서, 2 차 소금 또는 원래의 많은 문자 소금을 전달하는 대신 암호화 된 전체 암호를 전달하는 경우 결과에는 차이가 없습니다.

참고 : 세트 [a – za – z0–9./]에는 64 자, 64*64 = 4096이 포함되어 있습니다. 방법은 다음과 같습니다 캐릭터는 "4096 다른 방법들".

문서를 오해하고 있습니다. 소금의 길이는 기본 crypt () 구현에 따라 달라질 수 있으므로 전체 암호화 암호를 소금 값으로 제공해야합니다. 비밀번호를 확인할 때. 즉, 처음 두 숯을 잡아 당기는 대신 소금이됩니다.

초기 소금을 사용한다는 아이디어는 사용자 이름을 기반으로합니다.

Salting Passwords에 대한 일반적인 조언은 다음과 같습니다.

  1. 일반적으로 소금은 만들기 위해 사용됩니다 란 보우 테이블 계산하는 데 너무 많은 비용이 듭니다. 따라서 모든 암호 해시에 약간의 무작위 소금을 추가하고 해시 암호 값 옆에 일반 텍스트로 저장해야합니다.
  2. 사용 HMAC - 좋은 표준이며 암호와 소금을 연결하는 것보다 안전합니다.
  3. SHA1 사용 : MD5가 고장났습니다. 당신이 이것을 알고 있다면 의도하지 않고, 그냥 철저한 것입니다. ;)

그렇지 않을 것입니다 소금을 암호의 함수로 만드십시오. 공격자는 암호의 즉각적인 룩업 데이터베이스를 갖기 위해 무지개 테이블을 생성해야하지만 한 번만 그렇게하면됩니다. 임의의 32 비트 정수를 선택하면 2^32 테이블을 생성해야합니다.이 테이블은 (결정 론적 소금과 달리) 비용이 너무 많고 메모리 (및 시간) 비용이 많이 듭니다.

추가 강도의 경우 형식의 소금을 사용하여 Crypt 모듈을 MD5로 사용할 수 있습니다.

$1$ABCDEFGH$

여기서 abcdefgh는 당신의 소금 끈입니다.

>>> p = crypt.crypt('password', '$1$s8Ty3/f$')
>>> p
Out: '$1$s8Ty3/f$0H/M0JswK9pl3X/e.n55G1'
>>> p == crypt.crypt('password', p)
Out: True

(이것은 암호를위한 GNU 확장자입니다. Linux 시스템의 "Man Crypt"를 참조하십시오). MD5 (및 현재 SHA1조차도)는 "깨진"일 수 있지만 여전히 암호 해시에 비교적 우수하며 MD5는 여전히 Linux 로컬 비밀번호의 표준입니다.

비밀번호 또는 암호에서 파생 된 것은 소금으로 사용해서는 안됩니다. 특정 암호의 소금은 예측할 수 없어야합니다.

사용자 이름 또는 사용자 이름의 일부는 견딜 수 있지만 암호화 RNG의 임의 바이트입니다.

pbkdf2를 사용하십시오 이 의견 다른 스레드에서 (Python 구현 포함).

기사를 살펴보십시오 Truecrypt가 설명했습니다 Björn Edström. Truecrypt의 작동 방식에 대한 이해하기 쉬운 설명과 Truecrypt의 일부 기능에 대한 간단한 Python 구현이 포함되어 있습니다. 비밀번호 관리를 포함하여.

그는 파이썬의 truecrypt가 아닌 Python crypt () 모듈에 대해 이야기하고 있습니다.

기본 crypt.crypt() Python 2에서는 그다지 안전하지 않습니다 기사 더 안전한 대안이 얼마나 더 작동하는지 설명합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top