Telerik Sitefinity密码哈希函数

3
我有一个表格,里面记录了登录Telerik Sitefinity系统的凭证。我想要使用相同的登录凭证,但在一个没有Sitefinity库的不同应用程序中使用。我遇到了密码编码的问题,它被设置为哈希(默认是SHA1算法)。
我尝试使用以下代码对密码进行编码,但它与Sitefinity生成的不匹配。
public string EncodePassword(string pass, string salt)
{
    byte[] bytes = Encoding.Unicode.GetBytes(pass);
    byte[] src = Convert.FromBase64String(salt); 
    byte[] dst = new byte[src.Length + bytes.Length];
    Buffer.BlockCopy(src, 0, dst, 0, src.Length);
    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
    HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
    byte[] inArray = algorithm.ComputeHash(dst);
    return Convert.ToBase64String(inArray);
} 

例子:

密码: password111

盐: 94EBE09530D9F5FAE3D002A4BF262D2F (在SF用户表中保存)

使用上述的函数加密哈希值: 8IjcFO4ad8BdkD40NJcgD0iGloU=

SF生成的哈希值: A24GuU8OasJ2bicvT/E4ZiKfAT8=

我搜索了一下,但找不到关于SF如何以不同方式生成编码后的密码的结果。如何在没有SF库的情况下使用由SF创建的登录凭据?

1个回答

3

你是正确的,Sitefinity正在使用SHA1算法,但是你需要使用配置设置中的额外ValidationKey。

以下是你可以使用的工作代码示例:

private static bool CheckValidPassword(string password)
{
    //from sf_users column [salt]
    var userSalt = "420540B274162AA093FDAC86894F3172";

    //from sf_users column [passwd]
    var userPassword = "a99j8I0em8DOP1IAJO/O7umQ+H0=";

    //from App_Data\Sitefinity\Configuration\SecurityConfig.config attribute "validationKey"
    var validationKey = "862391D1B281951D5D92837F4DB9714E0A5630F96483FF39E4307AE733424C557354AE85FF1C00D73AEB48DF3421DD159F6BFA165FF8E812341611BDE60E0D4A";

    return userPassword == ComputeHash(password + userSalt, validationKey);
}

internal static string ComputeHash(string data, string key)
{
    byte[] hashKey = HexToBytes(key);
    HMACSHA1 hmacshA1 = new HMACSHA1();
    hmacshA1.Key = hashKey;
    var hash = hmacshA1.ComputeHash(Encoding.Unicode.GetBytes(data));
    return Convert.ToBase64String(hash);
}

public static byte[] HexToBytes(string hexString)
{
    byte[] numArray = new byte[hexString.Length / 2];
    for (int index = 0; index < numArray.Length; ++index)
        numArray[index] = Convert.ToByte(hexString.Substring(index * 2, 2), 16);
    return numArray;
}

1
它有效了!非常感谢。你在哪里找到这个信息的?我找不到任何关于SF如何进行哈希的信息。 - Jeandre Pentz
1
我刚刚反编译了他们的Telerik.Sitefinity.dll并找到了它的工作原理。 - Victor Leontyev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接