【问题标题】:How to incorporate this decryption into my code, to translate hashed password back to original如何将此解密合并到我的代码中,将散列密码转换回原始密码
【发布时间】:2020-03-12 20:30:31
【问题描述】:

我正在创建一个网站,该网站的 SQL 数据库连接到网站中的注册和登录功能。我想在将密码发送到数据库之前对密码进行哈希处理,我已经成功完成了,但是我发现当用户尝试登录时很难将哈希密码解密回来。

这是我的用户登录页面,我想在其中合并以下代码...

using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DogWalkingSite
{
    public partial class userlogin : System.Web.UI.Page
    {
        string strcon = ConfigurationManager.ConnectionStrings["con"].ConnectionString;

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            try
            {
                SqlConnection con = new SqlConnection(strcon);
                //checking to see if the connection is closed
                if (con.State == System.Data.ConnectionState.Closed)
                {
                    //opens state to connect to database
                    con.Open();
                }

                SqlCommand cmd = new SqlCommand("select * from user_master_tbl where user_id= '"+TextBox1.Text.Trim()+ "' and password= '" + TextBox2.Text.Trim() + "'", con);
                SqlDataReader dr = cmd.ExecuteReader();
                //HasRows will become false if the inputs are false
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        Response.Write("<script>" + "alert('"+dr.GetValue(5).ToString()+"');" + "</script>");
                        //sessions used to determine when to show buttons
                        Session["username"] = dr.GetValue(5).ToString();
                        Session["name"] = dr.GetValue(0).ToString();
                        Session["role"] = "user";
                    }

                    Response.Redirect("homepage.aspx");
                }
                else
                {
                    Response.Write("<script>" + "alert('Username does not exist');" + "</script>");
                }

            }
            catch (Exception ex)
            {

            }
        }
    }
} ```




``` public static bool VerifyPassword(string username,

                    string password,AccountDataContext context)

    {

        var user = context.UserAccounts.FirstOrDefault(p => p.UserName == username);

        if (user != null)

        {

            string salt = user.Password.Substring(user.Password.Length - DefaultSaltSize);

            string hashedPassword = CreateHash(password, salt);

            return hashedPassword.Equals(user.Password);

        }

        return false;



    } ```


【问题讨论】:

  • “将散列密码翻译回原始密码” - 你没有。为简单起见,您直接比较散列,而不是解密散列来比较原始值(这是不可能的。它是 散列)。
  • 散列密码的全部意义在于您无法从散列中反转实际密码。是的,两个不同的密码会产生相同的哈希值。
  • 您需要存储散列密码
  • 除了上述的 cmets 之外,也许还要重新审视你的腌制方法。盐应该是随机的
  • 您应该将 HASH(pwd) 存储在您的数据库中,正如我从您的问题中所理解的那样,您已经这样做了,然后您应该将 row["passwordColumn"] 与 HASH(suppliedPassword) 进行比较以检查是否输入的密码与注册时(或上次更改密码时)设置的密码一致。盐在这里不能是随机的,因为通常盐是这样使用的:HASH(pwd + SALT)。如果您使用随机盐,您还应该将其存储在数据库中,以便在比较期间能够使用相同的值进行盐,例如: if(HASH(suppliedPassword + row["SALT"]) == row["passwordColumn]) { // 授予条目 }

标签: c# sql asp.net


【解决方案1】:

您的原始问题已得到解答,但我想帮助您。

评论太多了,所以我就在这里发布......

代替:

SqlCommand cmd = new SqlCommand("select * from user_master_tbl where user_id= '"+TextBox1.Text.Trim()+ "' and password= '" + TextBox2.Text.Trim() + "'", con);

这样做:

SqlCommand cmd = new SqlCommand("select * from user_master_tbl where user_id = '@user' and password = '@pass'", con);
cmd.Parameters.AddWithValue("@user", TextBox1.Text.Trim());
cmd.Parameters.AddWithValue("@pass", FormsAuthentication.HashPasswordForStoringInConfigFile(TextBox2.Text.Trim(), "SHA1"));

总是像这样参数化用户输入。这将保护您免受 SQL 注入攻击。此外,它的可读性更强,IMO。

【讨论】:

  • 非常感谢您对我的帮助,我真的很感激。我已经按照你说的做了,看起来对吗?
  • ''' SqlCommand cmd = new SqlCommand("select * from user_master_tbl where user_id= '"+TextBox1.Text.Trim()+ "' and password= '" + TextBox2.Text.Trim( ) + "'", con); cmd.Parameters.AddWithValue("", TextBox1.Text.Trim()); cmd.Parameters.AddWithValue("", FormsAuthentication.HashPasswordForStoringInConfigFile(TextBox2.Text.Trim(), "SHA1")); '''
  • @MorganKeilty No.. 你需要复制并粘贴我给你的代码。我对其进行了编辑以包含您的哈希函数。
【解决方案2】:

当用户注册网站时,对值进行哈希处理并将其保存到数据库中,并与每次用户登录时的哈希值进行比较。

解密哈希是不可能的。因为哈希是一种单向函数。但是您可以尝试使用 Dictionary Attack 进行破解。 (Rainbow Table)

嗯..有帮助吗-_-?

【讨论】:

  • 谢谢,但我认为其他 cmets 让我意识到我是多么愚蠢哈哈
【解决方案3】:

只是加入一些最近教给我的东西,一个真正的密码哈希,是无法逆转的。

这就是密码学和密码散列之间的区别。

虽然破解加密的东西需要付出一些努力,但还是可以做到的。 密码哈希是一种方法。

我有一个可以同时处理这两种情况的 Nuget 包,这是一个实时示例:

DataJuggler.Core.Cryptography .Net 核心

DataJuggler.Net.Cryptography .Net 框架

  // Create passwordHash, trying up to 3 times to ensure it can be verified
  passwordHash = CryptographyHelper.GeneratePasswordHash(password, keyCode, 3);

  // Verify Hash
  verified = CryptographyHelper.VerifyHash(password, keyCode, passwordHash);

所以在你的数据库中存储密码哈希,如果被黑客入侵,一个值看起来像:

6aerTg31w4wkD2EEKalHtuwzd6n2W8VnrhtN+tozftd+5ZIk2JXuylL0mZJpR1j1xrObfmbSGzaPeBY2lj+lmoUu4tWpYvrBsFIpvmwb/cw=

现场演示:

https://blazorcrypto.datajuggler.com

视频包括 3D 动画来说明这一点:

https://youtu.be/w4NrmpeHykE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-28
    • 2021-09-26
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2020-08-15
    相关资源
    最近更新 更多