C# Telerik Sitefinity密码哈希函数

C# Telerik Sitefinity密码哈希函数,c#,hash,passwords,sha1,sitefinity,C#,Hash,Passwords,Sha1,Sitefinity,我有一个带有Telerik Sitefinity系统登录凭据的表。我希望使用相同的登录凭据,但使用不具有Sitefinity库的不同应用程序。我正在努力使用密码编码,它被设置为散列(默认为SHA1算法) 我尝试使用以下代码对密码进行编码,但与Sitefinity生成的密码不匹配 public string EncodePassword(string pass, string salt) { byte[] bytes = Encoding.Unicode.GetBytes(pass);

我有一个带有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创建的登录凭据

没错,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;
}
private static bool CheckValidPassword(字符串密码)
{
//来自sf_用户栏[salt]
var userSalt=“420540B274162AA093FDAC86894F3172”;
//从sf_用户列[passwd]
var userPassword=“a99j8I0em8DOP1IAJO/O7umQ+H0=”;
//从App\u Data\Sitefinity\Configuration\SecurityConfig.config属性“validationKey”
var validationKey=“862391D1B281951D92837F4DB9714E0A5630F96483FF39E4307AE733424C557354AE85FF1C00D73AEB48DF3421DD159F6BFA165FF8E812341611BDE60E0D4A”;
返回userPassword==ComputeHash(password+userSalt,validationKey);
}
内部静态字符串ComputeHash(字符串数据、字符串键)
{
字节[]哈希键=十六字节(键);
HMACSHA1 HMACSHA1=新的HMACSHA1();
hmacshA1.Key=hashKey;
var hash=hmacshA1.ComputeHash(Encoding.Unicode.GetBytes(data));
返回Convert.tobase64字符串(散列);
}
公共静态字节[]HexToBytes(字符串hextString)
{
byte[]numaray=新字节[hexString.Length/2];
对于(int index=0;index
它可以工作!非常感谢。你在哪里发现的?我找不到SF如何进行哈希的任何信息。我只是对他们的Telerik.Sitefinity.dll进行了反编译,找到了它的工作原理