0

パスワードの暗号化に問題があります。写真で強調表示されていないように、パスワードを暗号化してもらいたいのですが。

私は次のc#コードを書きました:

        SHA1CryptoServiceProvider x = new SHA1CryptoServiceProvider();

        //byte[] bs = System.Text.Encoding.Unicode.GetBytes(password);
        //byte[] bs = System.Text.Encoding.UTF32.GetBytes(password);
        byte[] bs = System.Text.Encoding.UTF8.GetBytes(password);
        bs = x.ComputeHash(bs);
        var s = new StringBuilder();
        foreach (byte b in bs)
        {
            s.Append(b.ToString("x2").ToLower());
        }

        new UserService().ChangeUserPassword(username, s.ToString());

正しい方法でパスワードを暗号化するには、削除したい次のSQLコードを使用します。

CAST(hashbytes('SHA1',@newuserpassword) as nvarchar)

これが結果です: ここに画像の説明を入力してください

4

2 に答える 2

2

のドキュメントを見ると、次のCONVERTことが必要だと思います。

CONVERT(nvarchar, hashbytes('SHA1',@newuserpassword), 2)

2 は、先頭に 0x を付けずに 16 進数に変換するスタイルです。nvarcharただし、40 (20 バイト、1 バイトあたり 2 文字)の長さを指定することをお勧めします。

于 2012-12-11T10:43:20.367 に答える
0

バイナリ データを文字で保存することをやめることを強くお勧めします。それでも、従来の理由で保持する必要がある場合は、SQL ステートメントの翻訳を次に示します。

byte[] bytes = ...; //your binary data here
var nastilyBrokenChars =
    Enumerable.Range(0, bytes.Length / 2)
    .Select(i => (char)BitConverter.GetInt16(bytes, i * 2))
    .ToArray();
string nastilyBrokenString = new string(nastilyBrokenChars);

できる限り、それぞれに 2 つbytesずつ詰め込んでいcharます。これ自体が無損失変換です。しかし、このデータを SQL Server に保存する (そして後で比較する) ことで損失が発生しないとは信じられません。

于 2012-12-11T11:49:50.637 に答える