在JAVA中实现.NET SHA1密码验证
我需要帮助在Java1.6中实现密码身份验证功能,数据源于.NET 背景:在项目中,我们将数据从客户的旧系统迁移到新系统。部分数据是用户的散列密码和密码 所以我有一个哈希密码和一个salt,都是字符串 据该客户称,密码哈希是使用标准的.NET SHA1加密创建的 我发现了详细说明.NET功能的代码,包括base64等,但没有JAVA代码在给定salt和预期哈希的情况下验证密码 不用说,我的试验没有成功 你能帮忙吗 详细说明: 我需要一个函数“HashPasswordLiket”,它将为我完成以下操作:在JAVA中实现.NET SHA1密码验证,java,asp.net,hash,passwords,sha1,Java,Asp.net,Hash,Passwords,Sha1,我需要帮助在Java1.6中实现密码身份验证功能,数据源于.NET 背景:在项目中,我们将数据从客户的旧系统迁移到新系统。部分数据是用户的散列密码和密码 所以我有一个哈希密码和一个salt,都是字符串 据该客户称,密码哈希是使用标准的.NET SHA1加密创建的 我发现了详细说明.NET功能的代码,包括base64等,但没有JAVA代码在给定salt和预期哈希的情况下验证密码 不用说,我的试验没有成功 你能帮忙吗 详细说明: 我需要一个函数“HashPasswordLiket”,它将为我完成以下
String passwordHash = hashPasswordLikeNET( String cleartextPassword, String salt );
boolean isValid = passwordHash.equals( storedPasswordHash );
不需要为新密码生成新的哈希/salt-如果用户在新系统中更改其密码,将使用不同的算法对其进行编码,并随后根据该算法进行验证
当我明天回来工作时,我将添加一个客户提供的示例密码/salt/hash,以及迄今为止我的一段代码
谢谢
尼尔
================其他详细信息==============
我们的客户让我们导入他当前的用户群,包括密码。它们存储为散列/盐组合
因此,我需要能够根据存储的哈希值验证用户登录时输入的密码,使用JAVA实现的客户“算法”。根据客户的说法,该算法是“标准ASP.NET SHA1”
以下是我的例子:
密码:12345!
哈希:UDRc2nvL4AGLL90xOzxg4PT3oqA=
盐:NJC5qJDJ8kh73jrPO+Z0zg==
也就是说,我需要做一些魔术来在JAVA中创建password*salt=hash
到目前为止,我的代码是:
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
String createHashLikeNET( String password, String salt ) throws PasswordServiceException
{
try
{
Mac sha1_HMAC = Mac.getInstance( "HmacSHA1" );
sha1_HMAC.init( new SecretKeySpec( salt.getBytes( "UTF-8" ), "HmacSHA1" ) );
byte[] hashedBytes = sha1_HMAC.doFinal( password.getBytes( "UTF-8" ) );
return Base64.encodeBase64String( hashedBytes );
}
catch (NoSuchAlgorithmException e)
{
throw new PasswordServiceException(e);
}
catch (InvalidKeyException e)
{
throw new PasswordServiceException(e);
}
catch (UnsupportedEncodingException e)
{
throw new PasswordServiceException(e);
}
}
public static void main(String[] args)
{
String expectedHash = "UDRc2nvL4AGLL90xOzxg4PT3oqA=";
String calculatedHash = createHashLikeNET( "12345!", "NJC5qJDJ8kh73jrPO+Z0zg==" );
System.out.println( "Expected: " + expectedHash + ", result: " + calculatedHash );
}
不管我如何调整我的代码,我都没有得到所需的结果
另外,有人能验证客户给我的示例是否在.NET中有效吗?呃,我不完全确定这里的问题是什么。MessageDigest可以创建哈希,默认情况下支持sha1,因此。。。你还需要什么呢?请提供更多的细节,比如你目前如何用C和Java进行哈希运算的例子。我最近遇到了这个问题,解决了我所有的加密难题。