2015-11-19 31 views
5

Potrzebuję twojej pomocy. Moi Java i Python skrypty nie coraz AME SHA-1 wartość wyrażenie:Java i python nie otrzymują tej samej wartości 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: Zakładając, że hasło jest już połączone: użycie rname, timestamp, app_id i secret_key

Czy jest coś, co przegapiłem? Myślę, że coś jest nie tak z moim reanimacją kodu Java. Formatowanie UTF-8: \ xe2 \ x80 \ x8b ale nie mogłem tego rozgryźć. Każda pomoc zostanie doceniona. Dzięki.

+0

Czy to zachowanie ma miejsce dla wszystkich wartości nazwy użytkownika/znacznika czasu? Czy możesz wysłać próbną parę użytkownika/znacznika czasu, którą próbujesz? –

+0

@ SanjayT.Sharma nazwa użytkownika: [email protected] timestamp: 1447943648 –

+0

Nie mogę odtworzyć twojego problemu tutaj; Otrzymuję tę samą wartość "eeae0d665ed71f3d8f4e3d344fda1c3735dc46c0" dla obu przy użyciu przykładowych danych wejściowych. –

Odpowiedz

1

Upewnij się, że oba wejścia używają dokładnie tego samego formatu i kodowania i spróbuj użyć biblioteki 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 

Zarówno signature wyjścia powinna być taka sama.

+1

Mała uwaga: format wejściowy HMAC powinien być dobrze zdefiniowany, np. nie powinno być możliwe, aby osoba atakująca zmieniła 'ab | c' na' a | bc '(ta sama wartość mieszana dla różnych pól). –