`
niunan
  • 浏览: 721563 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

强力重置ASP.NET membership加密后的密码!

    博客分类:
  • .NET
阅读更多
公司网站的用户管理采用的是ASP.NET内置的membership管理,在web.config文件中的密码格式配置是加密了的,passwordFormat="Hashed",这样在用户注册的时候存到数据库中的密码都是加密了的,如果你忘记密码了要找回密码的时候必须要记得注册时写的密码问题答案,可是如果密码问题答案也忘记的话。。。因为密码是加了密的,所以也不知道他的密码的生成规律,直接改数据库也不懂怎么改。。。
这个问题在以前的时候碰到过,当时特意上网搜索了一下,竟然没有发现,不知道是不是我的关键字输入错误还是怎么的,今天上台湾的论坛逛成人版块的时候发现论坛中的编辑版块有篇文章是教你怎么样在不记得密码,利用了membership其中的一个存储过程,废话少说,亮code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Configuration;
using System.Data.SqlClient;
using System.Web.Security;
using System.Data;

public partial class ResetPassword : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    // 重置
    protected void btnReset_Click(object sender, EventArgs e)
    {
        string connStr = WebConfigurationManager.ConnectionStrings["conn"].ToString();
        string username = txtUserName.Text.Trim();
        if (username.Length==0)
        {
            Response.Write("请输入用户名!");
            return;
        }

        //=== 产生加密用的密码密钥 ===  
        string salt = GenerateSalt();

        //=== 将明码密码加密(此时密码为"P@ssw0rd" 当然也可随机数生成) ===  
        string password = EncryptToHashString("123456", salt, "SHA1");

        SqlConnection conn = new SqlConnection(connStr);
        conn.Open();

        //=== 在此我们呼叫 Membership 提供者 数据库里的预存程序来重置密码 ===  
        SqlCommand cmd = new SqlCommand("aspnet_Membership_SetPassword", conn);
        cmd.CommandType = CommandType.StoredProcedure;

        //=== 目前使用 Membership 提供者的 web 应用程序名称 ===  
        cmd.Parameters.Add(new SqlParameter("@ApplicationName", Membership.ApplicationName));

        //=== 要重置密码的用户账号 ===  
        cmd.Parameters.Add(new SqlParameter("@UserName", username));

        //=== 加密过的密码 ===  
        cmd.Parameters.Add(new SqlParameter("@NewPassword", password));

        //=== 密码加密密钥(一定和使用加密密码的密钥一样,不要再重新产生) ===  
        cmd.Parameters.Add(new SqlParameter("@PasswordSalt", salt));

        //=== 重置密码的时间 ===  
        cmd.Parameters.Add(new SqlParameter("@CurrentTimeUtc", DateTime.Now));

        //=== 密码加密的格式(此时是Hash1,注意传入参数是int型态。) ===  
        cmd.Parameters.Add(new SqlParameter("@PasswordFormat", Membership.Provider.PasswordFormat.GetHashCode()));

        //=== 宣告一个可以接收回传值得参数 ===  
        SqlParameter returnValue = new SqlParameter();
        returnValue.ParameterName = "returnValue";
        returnValue.Direction = ParameterDirection.ReturnValue;
        cmd.Parameters.Add(returnValue);

        //=== 执行预存程序 ===  
        cmd.ExecuteNonQuery();

        conn.Close();

        //=== 检查重置密码是否成功 ===  
        if (returnValue.Value.ToString() == "0")
            Response.Write("重置密码成功!!");
        else
            Response.Write("重置密码失败!!");

    }

    /// <summary>  
    /// 密码加密钥  
    /// </summary>  
    /// <returns></returns>  
    public string GenerateSalt()
    {
        byte[] data = new byte[0x10];
        new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(data);
        return Convert.ToBase64String(data);
    }


    /// <summary>  
    /// 哈希密码加密(不可还原)  
    /// </summary>  
    /// <param name="s">原始字符串</param>  
    /// <param name="saltKey">Salt加密字符串</param>  
    /// <param name="hashName">加密格式(MD5, SHA1, SHA256, SHA384, SHA512.)</param>  
    /// <returns>加密过的密码</returns>  
    public string EncryptToHashString(string s, string saltKey, string hashName)
    {
        byte[] src = System.Text.Encoding.Unicode.GetBytes(s);
        byte[] saltbuf = Convert.FromBase64String(saltKey);
        byte[] dst = new byte[saltbuf.Length + src.Length];
        byte[] inArray = null;
        System.Buffer.BlockCopy(saltbuf, 0, dst, 0, saltbuf.Length);
        System.Buffer.BlockCopy(src, 0, dst, saltbuf.Length, src.Length);

        System.Security.Cryptography.HashAlgorithm algorithm = System.Security.Cryptography.HashAlgorithm.Create(hashName);
        inArray = algorithm.ComputeHash(dst);

        return Convert.ToBase64String(inArray);
    }

}


这样就把密码重置为123456了
刚刚在做membership的测试的时修实然想到,数据表aspnet_Membership中的Password字段是存储密码的,FormatPassword字段是表示密码的存储格式的,0是明码,1是加密过的,假如我在数据库中把已经加密了的密码的FormatPassword改为0,然后Password改成123456, 测试,哈哈,竟然也能登陆了!!!

分享到:
评论

相关推荐

    ASP.NET membership的XML配置

    ASP.NET membership是一个强大的身份验证和用户管理框架,用于构建安全的Web应用程序。它提供了一种标准的方法来管理和验证用户账户,而无需从头开始编写所有相关的安全代码。在这个主题中,我们将深入探讨ASP.NET ...

    asp.net 用户登录注册,修改密码小案例

    在这个“asp.net 用户登录注册,修改密码小案例”中,我们将深入探讨如何使用ASP.NET来实现这些常见的用户管理功能。 一、用户登录系统 1. **身份验证(Authentication)**:ASP.NET 提供了多种身份验证机制,如...

    一个完整的基于asp.net自带的登录、密码恢复、用户注册、密码修改网站

    用户收到邮件后,需在指定时间内在网站上输入这个代码或新密码,以完成密码重置过程。这通常涉及到邮件服务器的配置以及安全性问题,如加密传输。 用户注册通常包括收集用户的基本信息,如用户名、密码、电子邮件等...

    C# ASP.NET 密码管理专家

    本文将深入探讨"密码管理专家"这一主题,基于C# ASP.NET的技术背景,阐述如何构建一个安全的密码管理系统。 首先,密码管理是网络安全的重要组成部分,它涉及到用户账户的安全存储和验证。在C# ASP.NET环境下,我们...

    asp.net用户注册代码

    ASP.NET 提供了 `Membership` 类库,包含 `HashPasswordForStoringInConfigFile` 方法来处理密码哈希。 4. **数据库交互**:使用ADO.NET或Entity Framework等ORM工具将用户信息存入数据库。在ASP.NET中,常常使用...

    ASP.NET用户登录与注册

    ASP.NET 是微软开发的一种用于构建Web应用程序的框架,它提供了丰富的功能和工具,使得开发者能够高效地创建动态网站、Web服务以及Web应用程序。在“ASP.NET用户登录与注册”这个主题中,我们将深入探讨如何利用ASP...

    asp.net大二期末考试

    在ASP.NET中,可以通过 Membership API 来实现这些功能,例如创建新用户、验证用户凭据、修改用户信息等。同时,Role Provider 可以用于实现角色基线的权限分配,将用户分配到不同的角色,从而控制他们对网站资源的...

    ASP.NET会员登录管理系统

    同时,ASP.NET还提供了 Membership 和 Profile API,简化了用户管理和个性化设置的开发。 对于压缩包内的"ASP.NET会员管理系统",我们可以假设它包含了以下关键组件: - 注册和登录页面:用户注册新账户或登录现有...

    ASP.NET登录注册连接数据库

    ASP.NET提供了Membership API,它支持哈希和盐值加密,使得即使数据库被泄露,密码也不能轻易被还原。同时, Membership API 还包含了一些其他用户管理功能,如重置密码、激活账户等。 在"仓库管理系统"这个项目中...

    ASP.NET注册及登陆验证模块设计

    ASP.NET提供Membership API,帮助开发者处理用户注册过程,包括密码复杂度检查、密码哈希加密等安全措施。同时,可以使用验证控件(如RequiredFieldValidator、RegularExpressionValidator)确保输入数据的有效性。 ...

    用户登录举例 源代码asp.net

    Membership API 是ASP.NET提供的一套用于用户管理的类,包括用户注册、验证、密码重置等功能。Role Provider 则是用来管理用户角色的,便于实现基于角色的授权。 另外,为了提高安全性,应确保对用户输入进行适当的...

    asp.net用户注册登录模块Login源码

    ASP.NET Membership API 提供了一套全面的工具,用于处理用户账户管理,包括注册、登录、密码重置等功能。这个Login源码可能利用了Membership API来创建和管理用户账户。例如,`Membership.CreateUser()` 方法可以...

    ASP.NET (C#)网上书店源代码

    - 用户身份验证与授权:网上书店可能使用ASP.NET的成员资格(Membership)和角色(Roles)系统,来管理和控制用户的登录、注册以及权限分配。 - 数据绑定和控件:ASP.NET控件如GridView、ListView等,能方便地绑定...

    asp.net 注册模块

    ASP.NET 是一种由微软开发的服务器端Web应用程序框架,用于构建动态、数据驱动的Web应用程序。这个"asp.net 注册模块"的资源是为初学者准备的,它提供了一个基本的用户登录和注册功能的实现,这对于理解Web应用中的...

    asp.net(c#)会员注册模块

    再来,**找回密码** 功能是为用户提供忘记密码时重置密码的途径。这通常涉及到发送验证邮件到用户注册时提供的邮箱地址,用户点击邮件中的链接来设置新密码。ASP.NET提供了`ResetPassword()`方法,结合`...

    ASP.NET 2.0快速入门(6):ASP.NET 2.0 成员管理

    5. **密码重置与恢复**:ASP.NET 2.0还提供了方便的密码重置和恢复机制。例如,PasswordRecovery控件允许用户通过已验证的电子邮件地址来重置密码,增加了用户体验的安全性。 6. **自定义验证**:虽然ASP.NET 2.0...

    ASP.NET使用身份验证创建登录窗体

    2. **创建登录页面**:创建一个ASP.NET Web Form(如Login.aspx),在此页面上设计登录表单,包含用户名和密码输入框,以及登录按钮。同时,需要添加服务器端代码来处理登录逻辑。 3. **实现登录逻辑**:在服务器端...

    ASP.NET购物网站

    ASP.NET中的Membership Provider和Role Provider可以简化这些任务,通过预定义的接口和数据库架构,快速实现用户账户的创建、验证和管理。 产品分类查询是购物网站的关键功能之一。ASP.NET结合SQL Server或其他...

Global site tag (gtag.js) - Google Analytics