Java SHA256生成与Python中不同的哈希

福兹

我试图生成OTP,但是在尝试将代码从python重写为java之后,我得到了不同的输出。我不明白为什么,因为某些输出字符是相同的(当我更改uname或ctr时)。

密码:

from Crypto.Hash import SHA256

def get_otp(uname, ctr):

    inp = uname+str(ctr)
    binp = inp.encode('ascii')

    hash=SHA256.new()
    hash.update(binp)
    dgst=bytearray(hash.digest())

    out = ''
    for x in range(9):
       out += chr(ord('a')+int(dgst[x])%26)
       if x % 3 == 2 and x != 8:
           out += '-'

    return out

print(get_otp('78951', 501585052583))

JAVA代码:

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Main 
{
    public static void main(String[] args) throws NoSuchAlgorithmException 
    {
        System.out.println(get_otp("78951", "501585052583"));        
    }

    public static String get_otp(String uname, String otp) throws NoSuchAlgorithmException
    {
        String input = uname + otp;        
        byte[] binInput = input.getBytes(StandardCharsets.US_ASCII);

        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(binInput);

        String retVal = "";

        for(int i = 0; i < 9; ++i)
        {
           retVal += ((char)(((int)'a') + Math.floorMod((int)hash[i], 26)));

            if(i % 3 == 2 && i != 8)
                retVal += '-';
        }

        return retVal;
    }
}

谢谢你的帮助。

山姆·梅森

密码字节通常是无符号的;因此,我建议“修复” Java领域的这种矛盾,将循环换成类似以下内容:

    for(int i = 0; i < 9; ++i) {
        if(i > 0 && i % 3 == 0)
            retVal += '-';

        // bitwise AND with 0xff is to undo sign extension Java
        // does by default
        retVal += (char)('a' + (hash[i] & 0xff) % 26);
    }

许多原始的括号和演员表是多余的,因此我将其删除。如果您的实现只能是Java和Python,则在哪里“修复”此问题都没有关系

另一个加密点;如果您真的喜欢一次性文本密码,为什么不这样做:

public static String get_otp2()
{
    final SecureRandom rng = new SecureRandom();
    String out = "";
    for (int i = 0; i < 9; i++)  {
        if(i > 0 && i % 3 == 0)
            out += '-';
        out += (char)('a' + rng.nextInt(26));
    }
    return out;
}

并将其保存在某个地方?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Go Hmac SHA1生成的哈希与Java中的Hmac SHA1不同

Java SHA256向PHP SHA256输出不同的哈希吗?

需要像Java中那样在Objective C中生成HMAC SHA256哈希

目标C和Java中的Sha256哈希

SHA256:Swift 和 Java 中的不同输出?

SHA256哈希从OpenSSL和Sha256Sum实用程序Java不同产生。为什么?

在Java中为XML生成SHA-256哈希

Java Mac sha256哈希与使用包的PHP hmac sha256不匹配?

Java中的SHA256哈希-0xff按位运算的含义

Java和Python生成不同的Hmac-SHA256输出

OpenSSL和Java产生不同的SHA256 RSA签名

尝试将Java RSA-PSS签名验证码(带有SHA256哈希,SHA1 MGF哈希)转换为Python

Go SHA-256哈希与Java SHA-256哈希不同

如何在Node.js中验证Java生成的密码哈希(SHA-256)?

Python中的双哈希SHA256

比较 Java 和 PHP 中的 SHA256 输出

SHA256生成的文件和此文件的内容不同

如何在Java中使用sha256对某些字符串进行哈希处理?

如何在Java中使用SHA384生成48个字符的哈希

通过Java中的SHA-256哈希字符串

使用C ++中的键生成HMAC SHA256哈希

SQL Server中的SHA256 base 64哈希生成

Perl SHA-256 算法生成的输出与等效的 Java 不同

使用Java提供各种哈希算法(MD5,SHA1,SHA256等)的库吗?

为什么我的Java和命令行SHA256输出不同?

Android Java和PHP HASH HMAC SHA256不同的结果

如何获得URL可以安全匹配Java的Ruby生成的SHA256的HMAC?

java-有没有办法确认字符串是sha256哈希?

Java中的HMAC-SHA256产生的输出与JavaScript不同