Telerik Sitefinity密码哈希函数

本文关键字:函数 哈希 密码 Sitefinity Telerik | 更新日期: 2023-09-27 18:16:40

我有一个包含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

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

哈希函数:8IjcFO4ad8BdkD40NJcgD0iGloU=

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

我在网上搜索了SF是否产生不同的编码密码,但找不到任何结果。如果没有SF库,我如何使用SF创建的登录凭据?

Telerik Sitefinity密码哈希函数

你说得对,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;
}