Java 和 python 没有获得相同的 sha-1 值

标签 java python cryptography sha1

我需要你的帮助。我的 java 和 python 脚本没有得到字符串的 ame sha-1 值:

哈希.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()

哈希.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;
}

更新: 假设 password 已经串联:username, timestamp, app_id and secret_key

我错过了什么吗?我认为我的 java 代码有问题。 UTF-8 输出这个:\xe2\x80\x8b 但我无法弄明白。任何帮助将不胜感激。谢谢。

最佳答案

确保两个输入使用完全相同的格式和编码并尝试使用 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 输出应该相同。

关于Java 和 python 没有获得相同的 sha-1 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33807745/

相关文章:

c++ - 为什么第二个 'cin >>' 不会被处理?

cryptography - 公开我的受密码保护的 PGP key 是否安全?

Java String Equals()方法和多维数组

python - 在输出和目标标签之间使用 nn.Cross entropy

Python 索引错误值不在列表中...on .index(value)

python - 在 python 3.6 中安装 matplotlib 的问题

C# 设置 Outlook 默认签名

java - 如何测试索引越界错误?

java - 如何对齐在类内部而不是 xml 文件中动态创建的 imageView

java - 断言列表不为空——有或没有 Hamcrest?