Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
전반적인 보안 개선 PR 제3탄입니다. 아마 이게 마지막이 될 것 같네요 ^^
몇 달 전 비밀번호 암호화 개선 PR이 적용된 후, 패치에 포함된 난수생성기를 활용한 다양한 기능 개선이 있었습니다. 자동로그인 인증키, 아이디/비번찾기 인증키, 비공개 파일의 랜덤 파일명 등을 예측하기가 훨씬 어려워졌죠.
이 PR은 암호화 기능 강화의 연장선상에서, 흔히 사용되는 암호화 관련 기능들을 코어에 포함시키자는 제안입니다. 자료실에 서드파티 암호화 모듈이 있긴 하지만, 따로 설치해야 하고 설정 방법이 복잡해서 정작 강력한 보안이 필요한 코어 모듈에서는 사용하기 어려운 형편이거든요. 그래서 암호화 모듈을 과감하게 단순화하고, 다양하게 활용할 수 있는 디지털 서명 (digital signature) 기능을 추가했습니다.
개요
이 PR의 목표는 아래와 같습니다.
openssl
대신mcrypt
모듈이 설치된 서버에서도 사용 가능하도록 구현함조금 더 설명드리자면
이걸 어디다 쓰냐고요?
upload_info
가 무지막지하게 쌓이는데, 디지털 서명을 하면 이렇게 쌓아둘 필요가 없게 됩니다.코드 예제
이 PR에 포함된
Crypto
클래스는 아래와 같은 기능을 제공합니다.암호화
복호화
서명 작성 (
$data
를 폼에 넣기 전에)서명 확인 (
$data
와$signature
를 폼에서 돌려받은 후)현재 세션에서만 유효한 암호화 또는 서명 작성 (암호화 키의 일부를 세션에 저장하여, 다른 세션에서는 복호화 또는 서명 확인이 불가능하도록 만듬)
그 밖의 기술적 정보
현재 세션에서만 유효한 암호화 키는 각 세션에 저장됩니다. 세션과 무관하게 사이트 전체에서 유효한 암호화 키는
files/config/crypto.config.php
에 저장됩니다.암호화 키와 암호화 결과는 base64 인코딩하여 반환합니다. 이것을
base64_decode()
하면 defuse/php-encryption 라이브러리에서도 복호화가 가능합니다. 마찬가지로, defuse/php-encryption 라이브러리에서 암호화한 결과도base64_encode()
만 해주면 이 PR의Crypto
클래스에서 복호화가 가능합니다. 즉, 사실상의 표준인 defuse/php-encryption 라이브러리를 추후 적용하더라도 아무 문제가 없을 예정입니다.서버에
openssl
모듈이 설치되어 있는 경우 성능이 훨씬 향상됩니다. 그러나mcrypt
모듈로도 동일한 결과를 얻을 수 있습니다. 두 모듈 중 아무 것도 설치되어 있지 않은 경우에는 암호화 클래스 사용이 불가능합니다.