Skip to content

비밀번호 암호화 방법 개선 #889

@kijin

Description

@kijin

안녕하세요? 약 6년째 XE를 사용하고 있는 프로그래머입니다.

전에도 공식사이트 게시판에서 몇 차례 이와 관련된 논의가 있었던 것으로 기억하는데, 현재 XE의 비밀번호 암호화 방식은 md5($password) 또는 md5(sha1(md5($password))) 둘 중 하나를 선택하도록 되어 있어서 개인정보보호법 기준에 맞지 않는 것은 물론, 만약 DB가 유출될 경우 레인보우 테이블을 사용하여 쉽게 비밀번호를 유추할 수 있는 형편입니다.

예전에는 PHP 4 호환성을 위해 어쩔 수가 없었지만, XE 1.7부터는 반드시 PHP 5.2.4 이상을 사용하도록 하고 있기 때문에 더이상 예전 방식을 유지할 필요가 없다고 생각합니다. 요즘 뜨는 bcrypt까지는 아니더라도, 국제 표준인 PBKDF2 (HMAC-SHA256) 알고리듬 정도는 PHP 5.2.4에서도 충분히 사용이 가능하니까요. 그것조차 지원되지 않는 서버라면 최소한 솔트 정도는 넣어야겠죠.

그래서 좀더 다양한 비밀번호 암호화 방법들을 선택할 수 있도록 제가 member 모듈을 좀 수정해 보려고 합니다. 비슷한 작업을 몇 차례 해본 경험이 있거든요.

현재 계획은 다음과 같습니다.

  1. 관리모듈의 설정 > 일반 > 고급 카테고리에 옵션을 추가하여 비밀번호 암호화 알고리듬을 선택할 수 있도록 하고, 설정값은 다른 설정값들과 같이 db.config.php에 저장되도록 합니다. member 모듈에서 기존의 $useSha1 변수가 수행하던 기능은 이것으로 대체합니다.
  2. 선택 가능한 알고리듬은 md5(), md5(sha1(md5())), MySQL의password()old_password()` (여기까지는 기존에 사용하던 알고리듬들), SHA256, SHA512, MD5+솔트, SHA1+솔트, SHA256+솔트, SHA512+솔트, PBKDF2, 그리고 PHP 5.3.7 이상인 경우 bcrypt로 합니다.
  3. member.model.php를 수정하여 위와 같은 알고리듬으로 암호화된 비번도 체크할 수 있도록 합니다.
  4. 설정된 알고리듬과 다른 방식으로 암호화된 비번이 발견될 경우 자동으로 다시 암호화하도록 합니다. (현재 $useSha1을 사용할 경우 다시 암호화하는 방식과 유사합니다. 단, 다른 프로그램과의 호환성을 위해 일부러 예전 알고리듬을 사용하기를 원하는 경우 다시 암호화하지 않도록 하는 옵션을 추가하는 것도 고려해 보아야겠습니다.)
  5. member.controller.php를 수정하여 신규 회원가입, 회원정보 변경, 비번 변경, 비번 리셋 등의 경우에도 위에서 설정한 것과 동일한 알고리듬을 사용하도록 합니다.
  6. member 테이블의 password 필드는 현재 60자밖에 되지 않아 SHA512, PBKDF2 등 일부 알고리듬의 해시값을 저장하기에 충분하지 않습니다. 이것을 250자로 늘려서 추후 어떤 알고리듬이라도 넉넉하게 사용할 수 있도록 합니다.
  7. 위에서 중복되는 코드가 많이 발생할 경우 해당 부분을 별도의 클래스로 빼냅니다. classes/security 폴더에 Password.class.php라는 파일을 새로 만들어도 될까요?

모듈이나 애드온으로 만들어 배포하지 왜? 라고 생각하시는 분도 있겠지만, 회원의 개인정보 보호는 워낙 중요한 문제인데다가 비번 암호화는 원래 XE Core에서 담당하는 부분이기 때문에 XE Core 자체를 수정하지 않으면 개선하기 어렵습니다. XE 마켓에서 회원관리 확장 기능을 제공하는 모듈들을 봐도, 절대 다수가 member 모듈을 상속받아 사용할 뿐, 비번 암호화 관련 기능을 직접 구현하지는 않고 있습니다.

비번 암호화 방법 개선에 더하여 아래와 같은 기능도 구현할 수 있겠으나, 일단 중요한 것이 아니고 다른 모듈과의 호환성이 더 복잡해질 수 있으므로 미루어 두겠습니다.

  1. 설치할 때의 서버 환경을 분석하여 현재 서버가 지원하는 가장 강력한 암호화 알고리듬을 자동으로 선택합니다.
  2. 게시판 등 다른 모듈에서도 강력한 암호화 알고리듬을 사용할 수 있도록 합니다.

우선 작업을 해서 며칠 안에 pull request를 넣도록 하겠습니다.

건드리는 부분이 많다 보니 당장 XE Core에 포함시키기에는 어렵겠지만, XE 1.8에는 강력한 비밀번호 암호화 기능이 꼭 포함되었으면 좋겠습니다. 코어 개발자 분들의 꼼꼼한 검사와 꾸지람, 많은 테스트를 부탁드리며, 제가 적은 것보다 더 좋은 아이디어가 있으시다면 얼마든지 댓글 달아 주세요.

성기진 @kijin 올림

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions