2015-11-19 2 views
5

Мне нужна ваша помощь. Мои Java и Python скрипты не получают AME SHA-1 значение строки:Java и python не получают одинаковое значение 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: Предполагая, что пароль уже включен: rname, timestamp, app_id и secret_key

Есть ли что-то, что я пропустил? Я думаю, что что-то не так с моим java-кодом re. UTF-8 выводит это: \ xe2 \ x80 \ x8b, но я не мог понять это. Любая помощь будет оценена. Благодарю.

+0

Происходит ли такое поведение для всех значений имени пользователя/метки времени? Можете ли вы опубликовать образец пары пользователь/метка времени, которую вы пытаетесь? –

+0

@ SanjayT.Sharma имя пользователя: [email protected] timestamp: 1447943648 –

+0

Я не могу воспроизвести вашу проблему здесь; Я получаю то же самое значение «eeae0d665ed71f3d8f4e3d344fda1c3735dc46c0» для обоих вариантов ввода. –

ответ

1

Убедитесь, что оба входа используют точно такой же формат и кодировку и пытаются использовать библиотеку 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 

Оба signature выходы должны быть одинаковыми.

+1

Небольшое примечание: формат ввода HMAC должен быть четко определен, например, для злоумышленника не должно быть возможности изменять 'ab | c' в' a | bc '(то же хешированное значение для разных полей). –