【问题标题】:SHA256 encryption in JAVA and PYTHON produce different resultsJAVA 和 PYTHON 中的 SHA256 加密产生不同的结果
【发布时间】:2018-07-20 23:05:42
【问题描述】:

感谢您帮助理解为什么我在 JAVA 和 PYTHON 中的 SHA256 加密函数不会产生结果(1 位数字的差异,python 中的数字差异):

要加密的哈希是:“thisisatest”
Java 结果为:a7c96262c21db9a06fd49e307d694fd95f624569f9b35bb3ffacd88044f9787
Python 结果是: a7c96262c21db9a06fd49e307d694fd95f624569f9b35bb3ffacd880440f9787

Python 代码:

import hashlib

def encrypt_string(hash_string):
    sha_signature = \
        hashlib.sha256(hash_string.encode()).hexdigest()
    return sha_signature


hash_string = "thisisatest"
print(encrypt_string(hash_string), end="")

Java 代码:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class OpenAPIPasswordEncryptor1 {


    private static MessageDigest sha256;

    // generated password is stored encrypted (using also user name for hashing)
    public synchronized static String encrypt(String hash) {
        try {

            StringBuilder builder = new StringBuilder();
            builder.append(hash);

            // first time , encrypt user name , password and static key
            String encryptedCredentials = encryptionIterator(builder.toString());
           return encryptedCredentials;
        } 

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

        return "";
    }

    private static String encryptionIterator(String content) {
        try {
            sha256 = MessageDigest.getInstance("SHA-256");
            // append the static key to each iteration
            byte[] passBytes = (content).getBytes();
            sha256.reset();
            byte[] digested = sha256.digest(passBytes);
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < digested.length; i++) {
                sb.append(Integer.toHexString(0xff & digested[i]));
            }

            return sb.toString();
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        }

        return "";
    }

    // generate password for developers
    public static void main(String[] args) {
        String hash = "thisisatest";
        String encrypt = encrypt(hash);
        System.out.println("Your Password Is '" + encrypt + "'");
    }
}

【问题讨论】:

  • 没有必要相关,但使用String::getBytes时应始终指定编码。
  • 您的问题很难阅读。你为什么弄乱我的美化编辑?
  • @intentionallyleftblank - 由于某种原因无法在此处正确标记我的代码...不知道为什么
  • SHA 是不是加密,上网学习一下加密和密码散列的区别。

标签: java python sha256


【解决方案1】:

问题在于,如果(无符号)字节值为 15 或更少,Integer.toHexString(int) 会丢弃前导零。作为一种快速解决方法,您可以使用以下方法:

sb.append(String.format("%02x", 0xff & digested[i]));

虽然更高效的实现当然是可能的。

要在 Python 中产生相同的错误,请使用:

def encrypt_string(hash_string):
    sha_signature = hashlib.sha256(hash_string.encode()).digest()
    return "".join(["{:x}".format(b) for b in sha_signature])

【讨论】:

  • 不幸的是,目前答案是肯定的,遗留系统:(
  • 好的,我添加了一个 Python 实现的 bug。
  • 感谢您的帮助!
  • 伟大的收获!也把我绊倒了。
猜你喜欢
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 2012-10-14
相关资源
最近更新 更多