mysql로 아파치 호환 비밀번호 생성
현재 이전 웹 서버를 마이그레이션하는 중입니다.
이전 서버는 mysql 테이블에 저장되고 mod_auth_mysql
활성화 된 사용자와 함께 기본 인증을 사용합니다.
암호는 sha1 함수에서 작동 SELECT sha1('secret')
하는 apaches와 함께 저장됩니다.mod_auth_mysql
불행히도 mod_auth_mysql
더 이상 지원되지 않습니다. 그래서 mod_authn_dbd
대안을 찾았습니다 .
https://documentation.help/httpd-2.4-es/mod_authn_dbd.html
기본 인증 및 고정 암호로 로그인 할 수있을 때까지 모든 것을 실행하고 실행할 수있었습니다.
<Location />
AuthType Basic
AuthName "Test"
AuthBasicProvider dbd
Require valid-user
AuthDBDUserPWQuery "SELECT '{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=' FROM users WHERE user = %s"
</Location>
사용자 테이블에만 sha1 해시를 저장합니다. mod_auth_mysql
mysql ( SELECT sha1('test')=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
) mod_authn_dbd에 의해 생성 된 이전 허용 해시는 그렇지 않습니다.
에 따르면 https://documentation.help/httpd-2.4-es/password_encryptions.html
SHA1 "{SHA}"+ Base64로 인코딩 된 암호의 SHA-1 다이제스트.
htpasswd에 의해 생성 된 암호가 허용됩니다.
htpasswd -bns user test
user:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=
이제이 값 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
(암호 테스트를 위해 내 db에 저장 됨)을 qUqP5cyxm6YcTAhz05Hph5gvu9M=
mysql 내에서 (암호 테스트를 위해 허용되는 값 ) 으로 변환해야합니다.
나는 이미 시도했다
SELECT to_base64(sha1('test')), to_base64(ucase(sha1('test'))), to_base64(lcase(sha1('test')));`
그러나 어느 것도 예상 된 결과를 생성하지 않습니다.
기존 암호 해시를 예상 형식으로 변환하거나 mod_authn_dbd
기존 sha1 해시를 수락 하도록 설득하는 방법이 필요합니다 .
어떤 도움을 주시면 감사하겠습니다
답변
PHP 예제로 자신의 질문에 답했습니다. PHP의 pack () 함수는 바이너리 데이터의 16 진수 표현 (사람이 읽을 수 있도록 SHA-1 해시가 일반적으로 표시되는 것임)을 원래 바이너리 (사람이 읽을 수없는) 형식으로 변환합니다. 다음과 같이 생성 한 SHA-1 해시의 이진 형식에 대해 to_base64 ()를 실행해야합니다.
mysql> SELECT to_base64(unhex(sha1('test')));
+--------------------------------+
| to_base64(unhex(sha1('test'))) |
+--------------------------------+
| qUqP5cyxm6YcTAhz05Hph5gvu9M= |
+--------------------------------+
1 row in set (0.00 sec)
이 경우 MySQL만으로 원하는 출력을 얻을 수 있습니다.
이것은 내 질문에 대한 직접적인 대답은 아니지만 누군가가 같은 문제에 부딪힌 블로그 게시물을 찾은 해결 방법 일 수 있습니다.
http://nileshbansal.blogspot.com/2008/06/password-encryption-mysql-apache-and.html
주석에는 php와 htpasswd 호환 해시를 만드는 방법에 대한 링크가 있습니다. 나는 이것이 htpasswd -bns
명령 과 동일한 결과를 제공한다는 것을 확인했습니다.
function sha1_to_htpasswd ( $user, $sha )
{
return $user . ':{SHA}' . base64_encode( pack( "H" . strlen( $sha ), $sha ) );
}
아무도 더 나은 솔루션을 알지 못한다면 (mysql과 php없이) 비밀번호가 저장된 열로 사용자 테이블을 적절하게 확장합니다. 약간 중복되지만 작동합니다.