Využij akce až 30 % zdarma při nákupu e-learningu. Více informací. Zároveň je tento týden sleva až 80 % na e-learning týkající se C# .NET
Hledáme nového kolegu do redakce - 100% home office, 100% flexibilní pracovní doba. Více informací.
Avatar
Daniel Semerák:20. března 6:07

Zdravím.
Mám program, kde používám Login s heslem, ale nevím, jak ošetřit kod, aby se mi heslo neukládalo v základním tvaru, ale v Hash.
Také samozřejmě aby to fungovalo oběma směry. :-)

Zkusil jsem:

using Knihovna;
using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.Text;

...

private void BtnNoveHeslo_Click(object sender, EventArgs e)
                {
            if (TxtStareHeslo.Text == _nastaveni.Heslo && TxtNoveHeslo.Text == TxtPotvrzeniNovehoHesla.Text)
            {
                _nastaveni.Heslo = TxtNoveHeslo.Text;
                MessageBox.Show(
                    text:"Heslo bylo změněno.",
                    caption: "Změna hesla",
                    buttons: MessageBoxButtons.OK,
                    icon: MessageBoxIcon.Information);
                GrpZmenaHesla.Visible = false;
                //string source = _nastaveni.Heslo;
                string source = "Text";
                using (SHA1 sha1Hash = SHA1.Create())
                    {
                    //From String to byte array
                    byte[] sourceBytes = Encoding.UTF8.GetBytes(source);
                    byte[] hashBytes = sha1Hash.ComputeHash(sourceBytes);
                    string hash = BitConverter.ToString(hashBytes).Replace(_nastaveni.Heslo, TxtHeslo.Text);

                    MessageBox.Show("The SHA1 hash of " + source + " is: " + hash);

                    }
                }
            else if (TxtStareHeslo.Text != _nastaveni.Heslo)
            {
                MessageBox.Show(
                    text: "Nesouhlasí zadané staré heslo s DataBází.",
                    caption: "Chyba hesla",
                    buttons: MessageBoxButtons.OK,
                    icon: MessageBoxIcon.Error);
            }
            else if (TxtNoveHeslo.Text != TxtPotvrzeniNovehoHesla.Text)
            {
                MessageBox.Show(
                    text: "Nesouhlasí obě nová hesla.",
                    caption: "Chyba hesla",
                    buttons: MessageBoxButtons.OK,
                    icon: MessageBoxIcon.Error);
            }
        }
using Newtonsoft.Json;
using System.IO;

namespace Knihovna
{
        public class VychoziNastaveni
    {
        ...

        public string Heslo { get; set; } = "123";

Chci docílit: Viz výše.

 
Odpovědět
20. března 6:07
Avatar
Odpovídá na Daniel Semerák
Matúš Olejník:20. března 12:05

Ahoj, nie som c sharpista, ale kým ti niekto napíše tak si môžeš vygoogliť csharp hash password a určite tam nájdeš riešenie.

A čo myslíš tým aby to fungovalo oboma smermi? Čaro hashovania hesiel je práve v tom, že je to jednosmerný proces. Čiže ak zahashuješ heslo tak z hashu nevieš späť dostať pôvodné heslo. Takže keď chceš zistiť či sa heslá zhodujú, získaš hash aj z druhého a až tie porovnáš.

Editováno 20. března 12:05
Nahoru Odpovědět
20. března 12:05
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Daniel Semerák:20. března 13:18

To jsem už také zjistil jinde, že to je jen jednosměrný proces. :-)
Problém ale je, že kdokoli vlastně může ze souboru textového formátu vzít hash starého hesla a tím tak si změnit pro sebe přes nové heslo to staré. :-(
Takže by to chtělo asi ještě přidat nějaký ocásek, který bych znal jen já jako autor, ale který by se nikde neuváděl, jen v kodu programu.

 
Nahoru Odpovědět
20. března 13:18
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na Daniel Semerák
Matúš Olejník:20. března 13:36

Asi by som musel viacej vidieť do toho čo kódiš, ale keď by aj niekto získal jednotlivé hashe hesiel a potom nejaký z nich použil pre zmenu hesla tak kód by mal byť taký, že zoberie pôvodné heslo, vytvorí hash a až ten porovná so správnym hashom. Takže ak niekto ako pôvodné heslo vloží samotný hash tak sa znova z neho vytvorí hash a ten bude iný ako ten zo správneho hesla a preto by mala zmena hesla zlyhať.

Nahoru Odpovědět
20. března 13:36
/* I am not sure why this works but it fixes the problem */
Avatar
Veil
Člen
Avatar
Veil:20. března 14:22

jak říká kolega, nehledej v tom složitost, vytvoříš hash pro heslo, to si ulož klidně do textového souboru, pro ověření uživatele, znovu vytváříš hash a ten porovnáváš s tím co sis uložil. něco jako :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Security.Cryptography;

namespace HashTest
{
    public partial class Form1 : Form
    {
        public string passHash;
        public Form1()
        {
            InitializeComponent();
        }

        private void bZadej_Click(object sender, EventArgs e)
        {
            string passOriginal = tbText.Text;
            using (SHA1 sha1Hash = SHA1.Create())
            {

                byte[] sourceBytes = Encoding.UTF8.GetBytes(passOriginal);
                byte[] hashBytes = sha1Hash.ComputeHash(sourceBytes);
                passHash = BitConverter.ToString(hashBytes).Replace("-", string.Empty);

            }
        }

        private void bUhodni_Click(object sender, EventArgs e)
        {
            string passTry = tbText.Text;
            using (SHA1 sha1Hash = SHA1.Create())
            {

                byte[] sourceBytes = Encoding.UTF8.GetBytes(passTry);
                byte[] hashBytes = sha1Hash.ComputeHash(sourceBytes);
                string passTryHash = BitConverter.ToString(hashBytes).Replace("-", string.Empty);

                if (passHash != passTryHash)
                    MessageBox.Show("Špatné heslo");
                else
                    MessageBox.Show("Dobrá práce :-)");

            }
        }
    }
}
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět
20. března 14:22
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.