Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Хранимая процедура или функция на C#  [new]
overwriter
Member

Откуда:
Сообщений: 199
Присоединяю форум к себе на сайт и на нем кастомная авторизация есть через хранимую процедуру, в общем мне нужно похешить пароль который в нее передается, для этого хочу использовать хранимую процедуру или функцию на C#, никогда не занимался этим и есть проблемы, написал я что-то вроде этого:

public partial class StoredProcedures
{
    [SqlProcedure]
    public static void HashPassword(string password)
    {
        string hash = DoHashPassword(password, "899DDABC8C3524F67C1A9FE6E0836624DD3E6FCF63358BCBF619A8FA3EBDFD736D8C6BA83779E73A80953D9CF0CBFF377ECDDFEB685805EF5DC7B58142C12E97");
        SqlConnection conn = new SqlConnection {ConnectionString = "Context Connection=true"};

        SqlCommand cmd = new SqlCommand
                             {
                                 Connection = conn,
                                 CommandText = string.Format("SELECT '{0}'", hash)
                             };

        conn.Open();

        SqlDataReader rdr = cmd.ExecuteReader();
        SqlContext.Pipe.Send(rdr);

        rdr.Close();
        conn.Close();
    }

    /// <summary>
    /// Hashes the password.
    /// </summary>
    /// <param name="clearPassword">The clear password.</param>
    /// <param name="hashKey">Key to generate password hash</param>
    /// <returns>A string that contains the hashed password.</returns>
    private static string DoHashPassword(string clearPassword, string hashKey)
    {
        HMACSHA256 hash = new HMACSHA256 { Key = HexToByte(hashKey) };

        byte[] hashedPassword = hash.ComputeHash(Encoding.Unicode.GetBytes(clearPassword));
        string hashedPasswordBase64 = Convert.ToBase64String(hashedPassword);

        return hashedPasswordBase64;
    }

    /// <summary>
    /// Converts a hexadecimal string to a byte array. Used to convert encryption 
    /// key values from the configuration.
    /// </summary>
    /// <param name="hexString">String representing the long hexademical value</param>
    /// <returns>Array of bytes of the input string</returns>
    private static byte[] HexToByte(string hexString)
    {
        byte[] returnBytes = new byte[hexString.Length / 2];
        for (int i = 0; i < returnBytes.Length; i++)
        {
            returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
        }

        return returnBytes;
    }
};


а как получить результат селекта что-то сообразить не могу, помогите пожалуйста
25 июн 12, 19:02    [12772844]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура или функция на C#  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
HASHBYTES (Transact-SQL)
25 июн 12, 19:29    [12772951]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура или функция на C#  [new]
overwriter
Member

Откуда:
Сообщений: 199
invm,

Ну там же нету моего алгоритма...

тема ап, помогите плз... все работает и в моей процедуре, я не могу извлечь только данные синтаксис не понимаю...

EXECUTE @hash = HashPassword 'lalala'

возвращает RETURN из процедуры... так как процедура не может возвращать nvarchar то я не понимаю как это сделать...
26 июн 12, 11:59    [12775472]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура или функция на C#  [new]
Glory
Member

Откуда:
Сообщений: 104751
overwriter
так как процедура не может возвращать nvarchar то я не понимаю как это сделать.

RETURN - это вовсе не возврат параметров
Возврат параметров определяется при декларации параметров и вызове процедуры через ключевое слово OUTPUT
26 июн 12, 12:01    [12775490]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура или функция на C#  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
[quot overwriter]invm,
EXECUTE @hash = HashPassword 'lalala'

В @hash будет только резуьтат выполнения процедуры: 0 - успешный, отрицательное значение - неуспешный.
EXECUTE (Transact-SQL)
26 июн 12, 12:09    [12775545]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура или функция на C#  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Можно также
DECLARE @hash table ([hash] varbinary(max))

INSERT INTO @hash
EXECUTE HashPassword 'lalala'

SELECT TOP(1) hash FROM @hash
26 июн 12, 12:18    [12775630]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить