在JAVA中实现.NET SHA1密码验证

时间:2014-03-04 12:13:18

标签: java asp.net hash passwords sha1

我需要帮助在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”。

作为一个例子,我得到了以下内容:

  • 密码:12345!
  • 哈希:UDRc2nvL4AGLL90xOzxg4PT3oqA =
  • 盐:NJC5qJDJ8kh73jrPO + Z0zg ==

即。我需要做一些魔法来在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?

0 个答案:

没有答案