SQL SHA1 all'interno dove
-
05-09-2019 - |
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
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.