C# Liferay加密算法在.NETC中的实现#
我试图用c#编写Liferay使用PBKDF2和HMACSHA1/160/128000的相同算法,因为我们已经将哈希密码迁移到不同的平台。然而,哈希密码值在C中是不同的# 不太确定我哪里做错了。我对Java不是很熟悉 Java中传递的参数是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=
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);
}