0

我似乎不知道如何通过会员提供商使用 sha1 解密加密密码。

我不能在这里使用 .GetPassword() 方法,因为我正在从 sqldatasource 检索值并将它们放入 gridview 中。

这是网格视图:

    <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>

我已在 Templatefield 中用 itemtemplate 替换了 boundfield。itemtemplate 中的标签绑定到用户名,标签还有一个 OnDataBind="Decrypt" 应该解密标签的 Text 属性中的值。我一直在尝试一些我在网上找到的例子(甚至来自这个论坛),但我对 .net 的理解还没有那么好。这是我在解密()监听器中尝试的:

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 来“解密”任何东西,更不用说哈希了。

您的数据似乎是由 AES 加密的,而不是 sha。您也将编码与加密混淆了。以下是有关在 .net 中使用 AES 的一些信息:http: //msdn.microsoft.com/en-us/library/system.security.cryptography.aes.aspx

编码就是将字节数据解释为一种或另一种方案(ascii、unicode、UCT-8)中的字符,因此一旦您解密了数据,您可能必须将其编码为字符串以进行显示,但这对于解密来说是次要的.

附录:您可能无法避免使用membership.GetPassword(),因为您的会员数据库实施中使用的加密密钥可能无法检索。您是否考虑过使用对象数据源?然后您可以使用 .GetPassword() 预填充代码中的条目列表并将它们绑定到网格。

于 2012-11-13T20:00:01.567 回答