在 Java 中编码的 SHA1 从相同的 C# 代码中产生不同的结果
SHA1 coded in Java yields different results from identical C# code
这里是一些 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 中,byte
是 signed
,而在 C# 中,byte
是 unsigned
。 Java byte
在 C# 中的等价物是 sbyte
,而不是 byte
.
如果您想在 C# 中获得与 Java 相同的结果,请对在 Java
.
中使用的每个 byte
使用 sbyte
在 Java 版本中,您有盐后跟密码。在 C# 版本中,这是相反的。
这里是一些 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 中,byte
是 signed
,而在 C# 中,byte
是 unsigned
。 Java byte
在 C# 中的等价物是 sbyte
,而不是 byte
.
如果您想在 C# 中获得与 Java 相同的结果,请对在 Java
.
byte
使用 sbyte
在 Java 版本中,您有盐后跟密码。在 C# 版本中,这是相反的。