2016-11-04 12 views
2

Telerik Sitefinityシステムのログイン資格情報を持つテーブルがあります。同じログイン資格情報を使用したいが、Sitefinityライブラリを持たない別のアプリケーションを使用したい。私はハッシュ(デフォルトはSHA1アルゴリズム)に設定されているパスワードエンコーディングに苦労しています。Telerik Sitefinityパスワードハッシュ機能

次のコードを使用してパスワードをエンコードしようとしましたが、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); 
} 

例:

PASSWORD:password111

SALT:94EBE09530D9F5FAE3D002A4BF262D2F(SFユーザテーブルに保存されるように)

上記機能付きハッシュ表に=

ハッシュ8IjcFO4ad8BdkD40NJcgD0iGloU SFによって生成される:A24GuU8OasJ2bicvT/E4ZiKfAT8 =

SFがコード化されたパスワードを異なる方法で生成したが、結果が見つからない場合は、私はオンラインで検索しました。 SFライブラリではなくSFで作成したログイン資格情報を使用するにはどうすればよいですか?

答えて

2

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がどのようにそのハッシュを行うかについての情報を見つけることができませんでした。 –

+1

私はTelerik.Sitefinity.dllを逆コンパイルして、それがどのように動作するかを見いだしました –

関連する問題