【问题标题】:Telerik Sitefinity Password Hash functionTelerik Sitefinity 密码哈希函数
【发布时间】:2017-03-18 07:51:07
【问题描述】:

我有一张表,其中包含 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 创建的登录凭据?

【问题讨论】:

    标签: c# hash passwords sha1 sitefinity


    【解决方案1】:

    没错,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;
    }
    

    【讨论】:

    • 它有效!非常感谢。你是从哪里发现的?我找不到任何关于 SF 如何进行散列的信息。
    • 我刚刚反编译了他们的 Telerik.Sitefinity.dll 并发现了它是如何工作的
    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 2014-10-02
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    相关资源
    最近更新 更多