2015-11-19 11 views
5

私はあなたの助けが必要です。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: 私のJavaとPythonスクリプトは、文字列のAME SHA-1値を得ていません仮定するとパスワードはすでに連結されています:使用rname、timestamp、app_id、secret_key

私が見逃したことはありますか?私は、私のJavaコードreに何か問題があると思う。これを出力するUTF-8:\ xe2 \ x80 \ x8bしかし、私はそれを理解できませんでした。どんな助けもありがとう。ありがとう。

+0

この現象は、ユーザー名/タイムスタンプのすべての値に対して発生しますか?試しているサンプルのユーザー/タイムスタンプのペアを投稿できますか? –

+0

@ SanjayT.Sharmaユーザー名:[email protected]タイムスタンプ:1447943648 –

+0

問題は再現できません。私は、あなたのサンプル入力を使って、同じ 'eeae0d665ed71f3d8f4e3d344fda1c3735dc46c0'ハッシュ値を得ています。 –

答えて

1

両方の入力が全く同じ形式とエンコーディングを使用し、HMACライブラリを使用するようにしてください。

ジャワ:

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); 

パイソン:

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 'に変更することはできません'(フィールドごとに同じハッシュ値)。 –

関連する問題