C# Liferay加密算法在.NETC中的实现#

C# Liferay加密算法在.NETC中的实现#,c#,liferay,pbkdf2,C#,Liferay,Pbkdf2,我试图用c#编写Liferay使用PBKDF2和HMACSHA1/160/128000的相同算法,因为我们已经将哈希密码迁移到不同的平台。然而,哈希密码值在C中是不同的# 不太确定我哪里做错了。我对Java不是很熟悉 Java中传递的参数是 String algorithm = "PBKDF2WithHmacSHA1/160/128000" String plainTextPassword = "!!Fres1966" String encryptedPassword = null Java=

我试图用c#编写Liferay使用PBKDF2和HMACSHA1/160/128000的相同算法,因为我们已经将哈希密码迁移到不同的平台。然而,哈希密码值在C中是不同的# 不太确定我哪里做错了。我对Java不是很熟悉

Java中传递的参数是

String algorithm = "PBKDF2WithHmacSHA1/160/128000"
String plainTextPassword = "!!Fres1966"
String encryptedPassword = null
Java=“aaaaab9acnaq7ogwbkgrwfncsfh2demkmfl7jaqr8saqk”中的散列值 c#中的散列值=“FAAAAD0AQAAAAAAAAAFJZUX3EUFDHFHEMZLSDLO9RXSXO”

有一行代码我无法复制,那就是

BigEndianCodec.putLong(_saltBytes, 0, SecureRandomUtil.nextLong()) 
我不太确定这行代码在做什么,以及如何在c中复制类似的逻辑#

Java代码-------------

}

c代码#
BigEndianCodec.putLong(_saltBytes,0,SecureRandomUtil.nextLong())
似乎是“生成一个随机的8字节值并将其写入数组(以bigendian顺序;但它是随机的,所以这无关紧要)”

所以你想要

using (RandomNumberGenerator csprng = RandomNumberGenerator.Create())
{
    csprng.GetBytes(salt);
}

在分配
salt
和将其传递给
Rfc2898DeriveBytes
的ctor之间。

感谢您的响应,最终成功破解了它。盐存储在散列中,一旦我们提取了正确的盐,就能够得到正确的散列。
public string HasPassword(string password)
{
 byte[] salt = new byte[8];    
 Rfc2898DeriveBytes Rfcbytes = new Rfc2898DeriveBytes(password, salt,
             128000);
         byte[] key = Rfcbytes.GetBytes(160/8);

        var ms = new MemoryStream(8+salt.Length+key.Length);
        using (BinaryWriter writer = new BinaryWriter(ms))
        {
            writer.Write(160/8);   
            writer.Write(128000);
            writer.Write(salt);
            writer.Write(key);
        }   
        byte[] bytes = ms.ToArray();
        string finalhash = Convert.ToBase64String(bytes);

 return finalhash;
}
using (RandomNumberGenerator csprng = RandomNumberGenerator.Create())
{
    csprng.GetBytes(salt);
}