0

メンバーシッププロバイダーを介してsha1を使用して暗号化されたパスワードを復号化する方法がわからないようです。

sqldatasourceから値を取得してグリッドビューに配置しているため、ここでは.GetPassword()メソッドを使用できません。

グリッドビューは次のとおりです。

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="UserId" DataSourceID="SqlDataSource1" 
        EmptyDataText="There are no data records to display." 
        OnSelectedIndexChanged="GridView1_SelectedIndexChanged" >
        <Columns>
            <asp:CommandField ShowDeleteButton="True" ButtonType="Button" />
            <asp:TemplateField HeaderText="Block users">
                <ItemTemplate>
                    <asp:Button runat="server" ID="btnBlock" CommandName="Block" CommandArgument='<%# Eval("UserId") %>'
                        Text="Block" OnClick="btnBlock_Click" Visible='<%# !Convert.ToBoolean(Eval("IsLockedOut")) %>' />
                    <asp:Button runat="server" ID="btnDeblock" CommandName="Deblock" CommandArgument='<%# Eval("UserId") %>'
                        Text="Deblock" OnClick="btnBlock_Click" Visible='<%# Convert.ToBoolean(Eval("IsLockedOut")) %>' />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Username">
                <ItemTemplate>
                    <asp:Label ID="UserId" runat="server" Text='<%# Bind("UserId") %>' OnDataBinding="Decrypt" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="UserId" HeaderText="User id" ReadOnly="True"
                SortExpression="UserId" />
            <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" />
            <asp:BoundField DataField="LastLoginDate" HeaderText="Last login" 
                SortExpression="LastLoginDate" />
            <asp:CheckBoxField DataField="IsLockedOut" HeaderText="Locked" 
                SortExpression="IsLockedOut" />
            <asp:BoundField DataField="FailedPasswordAttemptCount" 
                HeaderText="Failed logins" 
                SortExpression="FailedPasswordAttemptCount" />
            <asp:BoundField DataField="Comment" HeaderText="Comments" 
                SortExpression="Comment" />
        </Columns>
    </asp:GridView>

テンプレートフィールドで、バウンドフィールドをitemtemplateに置き換えました。itemtemplate内のラベルはユーザー名にバインドされており、ラベルにはOnDataBind = "Decrypt"もあり、ラベルのText属性の値を復号化する必要があります。私は(このフォーラムからでも)オンラインで見つけたいくつかの例を試してきましたが、.netについての私の理解はまだそれほど素晴らしいものではありません。これがdecrypt()リスナーで試したことです:

public void Decrypt(object sender, EventArgs e)
{
    Label lbl = (Label)sender;
    string decrypted = string.Empty;
    UTF8Encoding encode = new UTF8Encoding();
    Decoder Decode = encode.GetDecoder();
    byte[] todecode_byte = Convert.FromBase64String(lbl.Text);
    int charCount = Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
    char[] decoded_char = new char[charCount];
    Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
    decrypted = new String(decoded_char);
    lbl.Text = decrypted;
}

最初にユーザー名を復号化しようとしましたが、パスワードと同じ方法だと思います。さらなる質問を排除するために、これがweb.configでの私の設定です

<membership defaultProvider="MembershipProvider">
  <providers>
    <clear/>
    <add name="MembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="GustaafConnectionString" 
         applicationName="Gustaaf" enablePasswordRetrieval="true" enablePasswordReset="false" requiresQuestionAndAnswer="true" 
         requiresUniqueEmail="false" passwordFormat="Encrypted"/>
  </providers>
</membership>
<machineKey validationKey="..." decryptionKey="..." validation="SHA1" decryption="AES"/>
4

1 に答える 1

2

SHA1はハッシュアルゴリズムであり、暗号化アルゴリズムではありません。ハッシュは定義上一方向であるため、元に戻すことはできません。そのため、ハッシュは言うまでもなく、shaを使用して何かを「復号化」することは決してありません。

データはshaではなくAESによって暗号化されているようです。また、エンコーディングと暗号化を混同しています。.netでのAESの使用に関する情報は次のとおりです。http://msdn.microsoft.com/en-us/library/system.security.cryptography.aes.aspx

エンコードとは、バイトデータを何らかのスキーム(ASCII、Unicode、UCT-8)の文字として解釈することです。したがって、データを復号化したら、表示用の文字列にエンコードする必要がありますが、これは復号化の二次的なものです。 。

補遺:メンバーシップDBの実装で使用されている暗号化キーを取得できない可能性があるため、membership.GetPassword()の使用を回避できない場合があります。代わりにオブジェクトデータソースを使用することを検討しましたか?次に、.GetPassword()を使用してコード内のエントリのリストを事前に入力し、それらをグリッドにバインドできます。

于 2012-11-13T20:00:01.567 に答える