首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SHA256加密在JAVA和Python语言中会产生不同的结果

SHA256加密在JAVA和Python语言中会产生不同的结果
EN

Stack Overflow用户
提问于 2018-07-20 22:28:19
回答 1查看 1.2K关注 0票数 1

我希望您能帮助我理解为什么我的SHA256加密函数在JAVA和Python语言中不能产生结果(在Python语言中有1位数字的差异,在PYTHON中又有1位数字的差异):

要加密的哈希是:"thisisatest“

Java结果是:a7c96262c21db9a06fd49e307d694fd95f624569f9b35bb3ffacd88044f9787

Python结果是:a7c96262c21db9a06fd49e307d694fd95f624569f9b35bb3ffacd880440f9787

Python代码:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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 + "'");
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-07-20 22:35:41

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

代码语言:javascript
复制
sb.append(String.format("%02x", 0xff & digested[i]));

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

要在Python中生成相同的错误,请使用以下命令:

代码语言:javascript
复制
def encrypt_string(hash_string):
    sha_signature = hashlib.sha256(hash_string.encode()).digest()
    return "".join(["{:x}".format(b) for b in sha_signature])
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51444782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档