2009-05-23 4 views
2

내 프로그램에서 우리는 레코드에 사용자의 IP 주소를 저장합니다. 레코드 목록을 사용자에게 표시하면 다른 사용자의 IP를 제공하지 않으므로 SHA1이이를 해시합니다. 사용자가 레코드를 클릭 할 때 그런 다음,이 같은 URL로 이동 :안에 SQL SHA1

http://www.example.com/allrecordsbyipaddress.php?ipaddress=SHA1HASHOFTHEIPADDRESS 

지금, 나는 SHA1 해시에 지정된 IP 주소로 모든 레코드를 나열해야합니다. 나는 이것을 시도했다 :

SELECT * FROM records 
WHERE SHA1(IPADDRESS)="da39a3ee5e6b4b0d3255bfef95601890afd80709" 

그러나 이것은 작동하지 않는다. 어떻게하면 좋을까요?
감사합니다. Isaac Waller

+1

IP 주소 대신 해시를 사용하는 이유는 무엇입니까? – Gumbo

+0

이 방법을 사용하면 쿼리를 수행 할 때마다 데이터베이스의 모든 주소에 대한 SHA1을 계산합니다. 그것은 놀라 울 정도로 느리고 CPU의 방대한 양을 사용할 것입니다. – blueshift

답변

4

쿼리가 그런 내가 SHA1 계산 정확히 한 곳을 발생 있는지 확인하십시오 것

SELECT * FROM records WHERE ip_sha1 = "..." 

될 것이다 그래야 내가, 원시 IP와 함께 데이터베이스에있는 IP의 SHA1를 저장하는 것 코드가 인 경우 여러 위치에서 약간 다르게 수행 할 수있는 기회가 없습니다. 그것은 또한 당신에게 계산에 소금을 섞을 수있는 기회를 제공합니다. 그래서 누군가가 관심있는 IP 주소에서 SHA1을 계산해서 손으로 전달할 수는 없습니다.

SHA1 해시를 저장하면 데이터베이스에서 ip_sha1에 보조 색인을 추가하여 SELECT 속도를 높일 수 있습니다. 매우 큰 데이터 세트가있는 경우 WHERE 절에서 SHA1을 수행하면 데이터베이스가 전체 테이블 스캔을 수행하고 모든 스캔시 모든 레코드에 대한 계산이 다시 수행됩니다.

+0

+1 : DRY (반복하지 말 것)는 * 핵심 원칙이며 각 핵심 데이터 또는 코드가 한 번만, 즉 "정확히 한 곳"에 존재하도록 보장합니다. 당신이 말했듯이, DRY의 중요한 부분입니다. –

+0

원시 IP 주소가 필요하지만 공용으로 공유하고 싶지는 않습니다. –

+0

@Isaac Waller : IP와 해시를 테이블에 저장할 수 있습니다. 그러면 검색 속도가 빠르고 문제 해결이 쉬워집니다. – Andomar

0

해시 알고리즘의 출력을 MySQL의 SHA1() 출력과 비교 했습니까? IP 주소 1.2.3.4의 예를 들면?

3

예상치 못한 해싱 불일치가 발생할 때마다 실수로 "\n"과 같은 공백이 포함 된 문자열이 해싱 되었기 때문입니다.

+0

+1 오른쪽 ... 기억 나는 – Andomar

7

중요한지 모르겠지만 SHA1 해시 da39a3ee5e6b4b0d3255bfef95601890afd80709은 빈 문자열의 잘 알려진 해시입니다.

실제로 해시 계산 기능에 주소가 실제 IP 인 것을 잊었습니까?

업데이트 :

웹 페이지 코드는 소문자로 SHA1 해시를 생성합니까?

이 검사는 MySQL에 실패합니다

SELECT SHA1('') = 'DA39A3EE5E6B4B0D3255BFEF95601890AFD80709' 

를이 경우, 이것을 사용 :

SELECT SHA1('') = LOWER('DA39A3EE5E6B4B0D3255BFEF95601890AFD80709') 

성공할 것이다.

또한 당신이 테이블에 레코드를 삽입 할 때, 당신은 SHA1 해시를 미리 계산 할 수 있습니다 :이 쿼리가 빠르게 작동 할 수 있도록

INSERT 
INTO ip_records (ip, ip_sha) 
VALUES (@ip, SHA1(CONCAT('my_secret_salt', @ip)) 

SELECT * 
FROM ip_records 
WHERE ip_sha = @my_salted_sha1_from_webpage 

이, ip_sha의 색인을 당신에게 원래 IP를 반환 허용됩니다.

+0

그것은 단지 예일뿐입니다. –

3

간단한 생각 : 매우 간단한 난독 화입니다. 단지 2 개의 의 가능한 IP 주소가 있으므로 기술적 지식을 가진 누군가가 알아 내고자한다면 40 억 개의 모든 해시를 계산할 수 있습니다. 이러한 IP 주소의 민감도에 따라 개인 조회 테이블을 고려할 수 있습니다.

+1

또는 적어도 소금. – blueshift

0

IP 주소를 암호화하고 다른 페이지에서 암호 해독했습니다. 그럼 난 그냥 SQL 쿼리에서 원시 IP 주소를 사용할 수 있습니다. 또한 무차별 공격 (예 : Autocracy)에 대해 보호합니다.