2015-11-19 26 views
5

Ho bisogno del tuo aiuto. I miei Java e Python script non ottenere l'ame SHA-1 il valore di una stringa:Java e python non ottengono lo stesso valore di sha-1

hash.py

# -*- coding: utf-8 -*- 
import hashlib 

username = raw_input('username:') 
timestamp = raw_input('timestamp:') 

app_id = 'dad' 
secret_key = 'dadda' 

print 'The hashed string is: ' , hashlib.sha1(username + timestamp + app_id + secret_key).hexdigest() 

hash.java

public static String generateSHA1(String password) 
{ 
    String sha1 = ""; 
    try 
    { 
     MessageDigest crypt = MessageDigest.getInstance("SHA-1"); 
     crypt.reset(); 
     crypt.update(password.getBytes("UTF-8")); 
     sha1 = byteToHex(crypt.digest()); 

    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    return sha1; 
} 

private static String byteToHex(final byte[] hash) 
{ 
    Formatter formatter = new Formatter(); 
    for (byte b : hash) 
    { 
     formatter.format("%02x", b); 
    } 
    String result = formatter.toString(); 
    formatter.close(); 
    return result; 
} 

UPDATE: Supponendo che la password sia già concatenata: uso rname, timestamp, app_id e secret_key

C'è qualcosa che mi è mancato? Penso che ci sia qualcosa di sbagliato nel mio codice java re. UTF-8 che emette questo: \ xe2 \ x80 \ x8b ma non riuscivo a capirlo. Qualsiasi aiuto sarà apprezzato. Grazie.

+0

Questo comportamento si verifica per tutti i valori del nome utente/timestamp? Puoi pubblicare una coppia campione/timestamp di esempio che stai provando? –

+0

@ SanjayT.Sharma nome utente: [email protected] data/ora: 1447943648 –

+0

Non riesco a riprodurre il problema qui; Ottengo lo stesso valore di hash 'eeae0d665ed71f3d8f4e3d344fda1c3735dc46c0' per entrambi usando i tuoi input campione. –

risposta

1

Verificare che entrambi gli input utilizzino esattamente lo stesso formato e codifica e provare a utilizzare la libreria HMAC.

Java:

String key = "2b5ba589b618ff2485f3391e425f86f0f405fd8e"; 
String data = "Something you want to keep secret!"; 
byte[] decodedKey = Hex.decodeHex(key.toCharArray()); 
SecretKeySpec keySpec = new SecretKeySpec(decodedKey, "HmacSHA1"); 
Mac mac = Mac.getInstance("HmacSHA1"); 
mac.init(keySpec); 
byte[] dataBytes = data.getBytes("UTF-8"); 
byte[] signatureBytes = mac.doFinal(dataBytes); 
String signature = new String(Base64.encodeBase64(signatureBytes), "UTF-8"); 

System.out.println("key = " + key); 
System.out.println("data = " + data); 
System.out.println("signature = " + signature); 

Python:

import hmac 
import hashlib 

key = "2b5ba589b618ff2485f3391e425f86f0f405fd8e" 
data = "Something you want to keep secret!" 
decodedKey = key.decode("hex") 
hmac = hmac.new(decodedKey, data.encode('UTF-8'), hashlib.sha1) 
signature = hmac.digest().encode('base64') 

print "key =", key 
print "data =", data 
print "signature =", signature 

Sia signature uscite devono essere uguali.

+1

Piccola nota: il formato di input dell'HMAC dovrebbe essere ben definito, ad esempio non dovrebbe essere possibile per un utente malintenzionato cambiare 'ab | c' in' a | bc '(stesso valore hash per campi diversi). –