java - 用 Java 编码的 SHA1 从相同的 C# 代码中产生不同的结果

标签 java c# encryption sha1 password-encryption

下面是一些 Java 代码,用于散列加盐密码并将第一个字节打印到控制台。打印值为 62。

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

class AuthTest
{
    public static void main (String[] args) throws java.lang.Exception
    {
        byte[] result;
        byte[] salt = new byte[] { (byte)0xe3, (byte)0x2c, (byte)0xf8, (byte)0x9e, (byte)0x6f, (byte)0xe4, (byte)0xf8, (byte)0x90 };
        byte[] password = "password".getBytes("UTF-8");

        result = getHash(1105, password, salt);
        System.out.println(result[0]);
    }

    public static byte[] getHash(int iterations, byte[] password, byte[] salt) throws NoSuchAlgorithmException,
        UnsupportedEncodingException {
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        md.reset();
        md.update(salt);
        byte[] result = md.digest(password);
        for (int i = 0; i < iterations; i++) {
            md.reset();
            result = md.digest(result);
        }
        return result;
    }
}

下面的 C# 代码,我认为与上面的相同,产生值 40。

void Main()
{
    byte[] salt = new byte[] { (byte)0xe3, (byte)0x2c, (byte)0xf8, (byte)0x9e, (byte)0x6f, (byte)0xe4, (byte)0xf8, (byte)0x90 };
    byte[] password = Encoding.UTF8.GetBytes("password");

    var result = GetHash(1105, password, salt);
    Console.WriteLine(result[0]);
}

public byte[] GetHash(int iterations, byte[] password, byte[] salt)
{
    var saltedPassword = password.Concat(salt).ToArray();
    using (var sha1 = new SHA1CryptoServiceProvider())
    {
        var result = sha1.ComputeHash(saltedPassword);

        for (int i = 0; i < iterations; ++i)
        {
            result = sha1.ComputeHash(result);
        }
        return result;
    }
}

谁能帮我找出不同之处?

最佳答案

主要区别之一是在 Java 中,bytesigned,而在 C# 中,byteunsigned。 C# 中 Java byte 的等效项是 sbyte,而不是 byte

如果您想在 C# 中获得与 Java 相同的结果,请对您在 Java 中使用的每个 byte 使用 sbyte

关于java - 用 Java 编码的 SHA1 从相同的 C# 代码中产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36289720/

相关文章:

java - 如何在进行 Jackson 反序列化时将 JSON 字段名称转换为 Java 兼容的属性名称?

java - 如何摆脱这个 "The import com.google.gwt cannot be resolved"

c# - 如何在aspx中创建一个json数组

c# - 如何修复不一致且缓慢的 Google Cloud Storage 响应时间?

c# - 使用当前同步上下文的并行 ForEach

c# - 使用由 iOs CCCrypt 函数使用 AES 生成的 C# 解密 base64 字符串

c# - 将 C# .Net 加密/解密算法迁移到 Ruby

java - Linux Gurobi LD_LIBRARY_PATH不满意的链接错误AWS

encryption - 为什么在对对称算法的暴力攻击中,尝试一半后有 50% 的机会找到 key ?

java - 将 Java 方法调用传递给 Scala 类/方法