2011-02-05 4 views
0

SQL Server에 문제가 있습니다. 내 작업은 PHP로 간단한 SQL Server 기반의 사용자 시스템을 구현하는 것입니다. 데이터베이스는 MMORPG에서도 사용되므로 데이터베이스 구조 또는 해시 알고리즘을 변경할 수 없습니다. 내 문제의 진짜 원인은 암호가 나는 테스트 사용자라는 test123을 작성암호가 해시 알고리즘 (SQL Server)과 일치하지 않습니다.

HashBytes('MD5', REVERSE(UPPER(@ID)) + @PW) 

다음 고리즘에 의해 해시되어있다 PW hallo123 무엇을이 시점까지 암호 해시 "0x7CEE495091E11FF9560D3D01651333220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"

을 준수 모든 것이 명확해야합니다. 글쎄, 쿼리로 데이터를 가져 오려고하면 결과가 없습니다. 다음 쿼리를 실행했습니다 :

mssql_query("SELECT * FROM [DB_Member].[dbo].[Member] WHERE ID = 'test123' AND PW = HashBytes('MD5', REVERSE(UPPER('test123')) + 'hallo123')"); 

결과를 반환합니다. 내가 직접 쿼리

mssql_query("SELECT * FROM [DB_Member].[dbo].[Member] WHERE ID = 'test123' AND PW = 0x7CEE495091E11FF9560D3D01651333220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000); 

를 실행한다면 나는 약 8 시간 동안 지금이 고심하고있어 문제

없이 데이터를 얻을 수 있지만 문제를 알아낼 수 없습니다.

답변

1

데이터 유형을 면밀히 조사해야한다고 생각합니다. 내 생각 엔 변수 @ID 및 @PW는 해시가 생성되는 char 데이터 형식입니다. 'test123'과 'hallo123'을 삽입하여 쿼리를 실행하면 해시를 생성 한 루틴에 있던 char (?) 데이터 유형과 일치하도록 공백을 추가해야합니다.

다음은 char 및 varchar 데이터 형식을 사용하여 차이점을 보여주는 예제입니다.

숯을 사용

declare @PW char(25) 
declare @ID char(25) 

set @PW = 'hallo123' 
set @ID = 'test123' 

select (HashBytes('MD5', REVERSE(UPPER(@ID)) + @PW)) 

해시 결과를 VARCHAR

declare @PW varchar(25) 
declare @ID varchar(25) 

set @PW = 'hallo123' 
set @ID = 'test123' 

select (HashBytes('MD5', REVERSE(UPPER(@ID)) + @PW)) 

해시 결과

0x870B01D196916AFA88EBC900BE5395BE 
,369 사용

0x9F1E0132F198216841E2608901D27115 

해시가 분명히 일치하지 않습니다.

해시가 바이너리 (60) 입력란에 저장되어 있기 때문에 해시 값이 0이되는 이유는 다음과 같습니다. HashBytes는 VarBinary를 반환하지만 쿼리가 실패하지는 않습니다. 바이너리와 VarBinary를 비교할 때 SQL Server는 일종의 변환을 수행합니다.

+0

위대한 답변, 감사합니다! 쿼리가 정확히 서버에서 수신되는 방식을 살펴 보는 방법이 있습니까? 그런 다음 생성 된 해시를 확인할 수 있습니다. 감사합니다. – Thomas

+0

@ 토마스 - 암호를 설정할 때 SQL Server 프로파일 러를 사용하여 서버로 전송되는 내용을 볼 수 있습니다.추적을 설정하고 암호를 변경하기 직전에 시작한 다음 가능한 한 빨리 해제하십시오. 그런 다음 로그를 읽고 암호를 변경하는 문구를 찾고 매개 변수의 내용을 살펴볼 필요가 있습니다. 내가 준 예는 그들이 공백으로 채워진 곳이었다. 그들은 다른 어떤 것으로 채워질 수 있습니다. –

0

당신이 사용하는 언어가 이상하게 인코딩 될 수 있습니까? SQL 프로파일 러를 끌어 와서 차이점을 발견 할 수 있는지 확인하기 위해 전송되는 쿼리를 살펴 본다면 어떻게 될까요?

0

SELECT HashBytes('MD5', REVERSE(UPPER('test123')) + 'hallo123')을 실행하면 결과가 0x870B01D196916AFA88EBC900BE5395BE가됩니다. 해시 생성이 정확하고 테스트 사용자 생성시 올바른 ID와 비밀번호를 사용 했습니까?

관련 문제