문제

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

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

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

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

그러나 이것은 작동하지 않습니다. 어떻게할까요?
감사합니다, Isaac Waller

도움이 되었습니까?

해결책

쿼리가 될 수 있도록 원시 IP와 함께 데이터베이스에 IP의 SHA1을 저장합니다.

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

그런 다음 SHA1 계산이 발생하는지 확인합니다 정확히 한 곳 코드에서는 여러 곳에서 약간 다르게 수행 할 기회가 없습니다. 또한 소금을 계산에 혼합 할 수있는 기회를 제공하므로 누군가가 관심있는 IP 주소로 SHA1을 계산하고 손으로 전달할 수 없습니다.

SHA1 해시 저장 데이터베이스는 또한 IP_SHA1에 2 차 색인을 추가하여 해당 선택 속도를 높일 수 있습니다. 매우 큰 데이터 세트가있는 경우, Clauses에서 SHA1을 수행하면 데이터베이스가 전체 스캔의 모든 레코드에 대한 계산을 다시 수행하는 것과 함께 데이터베이스가 전체 테이블 스캔을 수행하도록 강요합니다.

다른 팁

그것이 중요한지 모르지만 당신의 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 그리고 색인을 허용합니다 ip_sha, 이 쿼리가 빠르게 작동하도록합니다.

예상치 못한 해싱 불일치를 가질 때마다 실수로 우연히 공백이 포함 된 문자열을 해시했기 때문입니다. "\n".

간단한 생각 : 그것은 매우 간단한 난독 화입니다. 2 만 있습니다32 가능한 IP 주소이므로 기술 지식을 가진 사람이 파악하고 싶다면 40 억 해시를 모두 계산하여 그렇게 할 수 있습니다. 해당 IP 주소의 감도에 따라 개인 조회 테이블을 고려할 수 있습니다.

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

결국 IP 주소를 암호화하고 다른 페이지에서 해독했습니다. 그런 다음 SQL 쿼리에서 원시 IP 주소를 사용할 수 있습니다. 또한, 그것은 마약과 같은 무차별 인력 공격으로부터 보호합니다. 독재 말했다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top