Domanda

Nel mio programma, abbiamo memorizzare l'indirizzo IP di un utente in un record. Quando visualizziamo un elenco di record da un utente, non vogliamo dare via IP dell'altro utente, quindi abbiamo hash SHA1 esso. Poi, quando l'utente fa clic su un record, si va a un URL simile a questo:

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

Ora, ho bisogno di elencare tutti i record con l'indirizzo IP specificato nel hash SHA1. Ho provato questo:

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

, ma questo non funziona. Come faccio a fare questo?
Grazie, Isaac Waller

È stato utile?

Soluzione

Mi piacerebbe conservare lo SHA1 del IP nel database insieme con l'IP grezzo, in modo che la query sarebbe diventato

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

Poi mi piacerebbe fare in modo che il calcolo SHA1 accade esattamente un luogo nel codice, in modo tale che non c'è alcuna possibilità per esso essere essere fatto in modo leggermente diverso in più posti. Che ti dà anche la possibilità di mescolare un sale nel calcolo, in modo che qualcuno non può semplicemente calcolare la SHA1 su un indirizzo IP che sono interessati e passare che a mano.

Memorizzazione l'hash SHA1 del database che si dà anche la possibilità di aggiungere un indice secondario su ip_sha1 acceleriamo anche quel SELECT. Se si dispone di un grande insieme di dati, facendo la SHA1 nelle clausole dove le forze del database per fare una scansione completa tavolo, insieme a rifare un calcolo per ogni record su ogni scansione.

Altri suggerimenti

Non so se è importante, ma il vostro SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709 hash è un hash ben noto di una stringa vuota.

E 'solo un esempio o si è dimenticato di fornire un indirizzo IP reale per effettuare il calcolo di hash?

Aggiornamento:

Il vostro codice di pagina web generare hash SHA1 in minuscolo?

Questo controllo non riesce a MySQL:

SELECT  SHA1('') = 'DA39A3EE5E6B4B0D3255BFEF95601890AFD80709'

In questo caso, utilizzare questo:

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

, che avrà successo.

Inoltre, è possibile precalculate l'hash SHA1 quando si inseriscono i record nella tabella:

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

Ciò restituirà la IP originale e consentire l'indicizzazione di ip_sha, in modo che la query funziona veloce.

Ogni volta che ho avuto un disadattamento hashing inaspettato, è stato perché ho accidentalmente hash una stringa che comprendeva alcuni spazi bianchi, come ad esempio "\n".

Solo un pensiero veloce: questo è molto semplice offuscamento. Ci sono solo 2 32 possibili indirizzi IP, quindi se qualcuno con conoscenze tecniche voluto capirlo, che potevano fare che calcolando tutti i 4 miliardi di hash, che non ci sarebbe voluto molto tempo. A seconda della sensibilità di tali indirizzi IP, si può prendere in considerazione una tabella di ricerca privata.

Lo si confronta l'uscita del vostro algoritmo hash con l'uscita di SHA1 di MySQL ()? Ad esempio per l'indirizzo IP 1.2.3.4?

Ho finito per criptare gli indirizzi IP, e li decifrare dall'altra pagina. Poi posso solo utilizzare l'indirizzo IP prima nella query SQL. Inoltre, protegge contro gli attacchi di forza bruta, come autocrazia detto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top