我需要帮助在JAVA(1.6)中实现密码验证功能,其中数据源自.NET。
背景:在项目中,我们正在将数据从客户的旧系统迁移到新系统。部分数据是用户的散列密码和盐。
所以我有一个哈希密码和一个盐,都是字符串。
根据客户的说法,密码哈希是使用“标准.NET SHA1加密”创建的。
我发现代码详细说明了.NET的功能(包括base64-ing等),但是在JAVA中没有代码可以在给定salt和预期散列的情况下验证密码。
毋庸置疑,我的试验并不成功。
你能帮忙吗?
详细说明:
我需要一个函数'hashPasswordLikeNET'来为我做这个:
String passwordHash = hashPasswordLikeNET( String cleartextPassword, String salt );
boolean isValid = passwordHash.equals( storedPasswordHash );
没有必要为新密码生成新的哈希/盐 - 如果用户在新系统中更改密码,则将使用不同的算法对其进行编码(随后根据该算法进行验证)。
当我明天回来工作时,我将添加客户提供的示例密码/ salt / hash以及到目前为止我的代码片段。
谢谢!
尼尔
============其他细节==============
我们的客户向我们提供了导入其当前用户群的任务,包括密码。这些存储为散列/盐组合。
所以我需要能够使用在JAVA中重新实现的客户'算法'来验证用户在登录存储的哈希值时输入的密码。根据客户的说法,该算法是“标准ASP.NET SHA1”。
作为一个例子,我得到了以下内容:
即。我需要做一些魔法来在JAVA中制作密码* 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?