예제 #1
0
        public void SetPasswords()
        {
            var hashOptions = new HashOptions();

            Configuration.GetSection("HashOptions").Bind(hashOptions);

            var optionsList = Options.Create(hashOptions);

            var hashService = new HashService(optionsList);

            var pathToFile = Directory.GetCurrentDirectory()
                             + Path.DirectorySeparatorChar
                             + "conturi.txt";

            using (var newfile = File.Create("conturi-cu-parole.txt"))
            {
                using (var logWriter = new StreamWriter(newfile))
                    using (var reader = File.OpenText(pathToFile))
                    {
                        while (reader.Peek() >= 0)
                        {
                            var fileContent = reader.ReadLine();

                            var data   = fileContent.Split('\t');
                            var hashed = hashService.GetHash(data[1]);

                            logWriter.WriteLine(fileContent + '\t' + hashed);
                        }
                    }
            }
        }
예제 #2
0
        public async Task ThrowIfNotValidAsync(HashOptions item)
        {
            var validationContext = await _validator.ValidateAsync(item);

            if (!validationContext.IsValid)
            {
                throw new ValidationException(validationContext.Errors.AsString());
            }
        }
예제 #3
0
 private static Argon2id GetArgon2id(byte[] passphrase, byte[] salt, HashOptions options = null)
 {
     return(new Argon2id(passphrase)
     {
         DegreeOfParallelism = options?.DoP ?? Constants.Argon.DoP,
         MemorySize = options?.MemorySize ?? Constants.Argon.MemorySize,
         Salt = salt,
         Iterations = options?.Iterations ?? Constants.Argon.Iterations
     });
 }
예제 #4
0
        public async Task <string> Authentication(string email, string senha)
        {
            const string methodName = nameof(Authentication);
            string       header     = $"METHOD | {email} | {serviceName}: {methodName}";

            try
            {
                logger.LogInformation((int)LogEventEnum.Events.GetItem,
                                      $"{header} - {MessageLog.Getting.Value}");

                Revendedor revendedor = await context.Revendedores.SingleOrDefaultAsync(item => item.Email.Equals(email));

                if (revendedor is null)
                {
                    logger.LogWarning((int)LogEventEnum.Events.GetItem,
                                      $"{header} - {MessageError.NotFoundSingle.Value}");

                    return(string.Empty);
                }

                if (!HashOptions.VerifyPasswordHash(senha, revendedor.Senha))
                {
                    logger.LogWarning((int)LogEventEnum.Events.GetItem,
                                      $"{header} - {MessageError.NotFoundSingle.Value}");

                    return(string.Empty);
                }

                List <Claim> claims = new List <Claim>();
                claims.Add(new Claim(ClaimTypes.Name, revendedor.Email));

                claims.Add(new Claim(ClaimTypes.Role, "all"));

                JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
                byte[] key = Encoding.ASCII.GetBytes(settingsOptions.Secret);
                SecurityTokenDescriptor tokenDescriptor = new SecurityTokenDescriptor
                {
                    Subject            = new ClaimsIdentity(claims),
                    Expires            = DateTime.UtcNow.AddDays(1),
                    SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
                };

                SecurityToken stringToken = tokenHandler.CreateToken(tokenDescriptor);

                logger.LogInformation((int)LogEventEnum.Events.GetItem,
                                      $"{header} - {MessageLog.Getted.Value}");

                return(tokenHandler.WriteToken(stringToken));
            }
            catch (Exception)
            {
                throw;
            }
        }
예제 #5
0
        public async Task <Revendedor> Register(Revendedor entity)
        {
            const string methodName = nameof(Register);
            string       header     = $"METHOD | {entity.Email} | {serviceName}: {methodName}";

            try
            {
                logger.LogInformation((int)LogEventEnum.Events.InsertItem,
                                      $"{header} - {MessageLog.Saving.Value}");

                if (string.IsNullOrEmpty(entity.Senha))
                {
                    logger.LogWarning((int)LogEventEnum.Events.GetItemNotFound,
                                      $"{header} - {MessageError.PasswordNullorEmpty.Value}");

                    throw new Exception(MessageError.PasswordNullorEmpty.Value);
                }

                entity.Senha = HashOptions.CreatePasswordHash(entity.Senha);

                entity.Cpf = entity.Cpf.Replace(".", string.Empty).Replace("-", string.Empty)
                             .Replace(";", string.Empty).Replace(",", string.Empty).Replace("/", string.Empty);

                context.Revendedores.Add(entity);

                await context.SaveChangesAsync();

                logger.LogInformation((int)LogEventEnum.Events.InsertItem,
                                      $"{header} - {MessageLog.Saved.Value} | ID: {entity.Id}");

                string json = JsonConvert.SerializeObject(entity);

                await historicoService.Create(new Historico
                {
                    ChaveTabela     = entity.Id,
                    NomeTabela      = typeof(Revendedor).Name,
                    JsonAntes       = string.Empty,
                    JsonDepois      = json,
                    Usuario         = entity.Email,
                    IdTipoHistorico = (int)TipoHistoricoEnum.Action.Register
                });

                return(entity);
            }
            catch (Exception)
            {
                throw;
            }
        }
예제 #6
0
        private void ConfigureHash(IApplicationBuilder app)
        {
            _container.RegisterSingleton(() => app.ApplicationServices.GetService <IOptions <HashOptions> >());
            var hashOptions = new HashOptions();

            Configuration.GetSection(nameof(HashOptions)).Bind(hashOptions);

            if (hashOptions.ServiceType == nameof(HashServiceType.ClearText))
            {
                _container.RegisterSingleton <IHashService, ClearTextService>();
            }
            else
            {
                _container.RegisterSingleton <IHashService, HashService>();
            }
        }
예제 #7
0
        public virtual async Task HashFileAsync(HashOptions opts)
        {
            await ThrowIfNotValidAsync(opts);

            var outputPath = BuildOutputPath(opts);
            var tasks      = new List <Task>();
            var slimCount  = opts.ProgramMode == ProgramMode.Sync ? 1 : Environment.ProcessorCount;

            using (var sempahore = new SemaphoreSlim(slimCount))
                using (var ifs = new FileStream(opts.InputPath, FileMode.Open, FileAccess.Read, FileShare.Read, opts.BlockSize))
                    using (var ofs = new FileStream(outputPath, FileMode.Create, FileAccess.Write, FileShare.Write, opts.BlockSize))
                    {
                        for (var offset = 0; offset < ifs.Length; offset += opts.BlockSize)
                        {
                            await sempahore.WaitAsync();

                            tasks.Add(Task.Run(async() =>
                            {
                                try
                                {
                                    var chunk = await ReadBytesAsync(ifs, opts.BlockSize);
                                    var hash  = GetHash(chunk);
                                    await WriteBytesAsync(ofs, hash);
                                }
                                finally
                                {
                                    sempahore.Release();
                                }
                            }));
                        }

                        await Task.WhenAll(tasks);

                        ifs.Close();
                        ofs.Close();
                    }
        }
예제 #8
0
 protected virtual string BuildOutputPath(HashOptions opts)
 => $"{opts.InputPath}.hashes_{opts.HashAlgorithm}";
예제 #9
0
        /// <summary>
        /// Create a Hash byte array using Argon2id.
        /// </summary>
        /// <param name="passphrase"></param>
        /// <param name="salt"></param>
        /// <param name="size"></param>
        public static async Task <byte[]> GetHashKeyAsync(byte[] passphrase, byte[] salt, int size, HashOptions options = null)
        {
            using var argon2 = GetArgon2id(passphrase, salt);

            return(await argon2.GetBytesAsync(size).ConfigureAwait(false));
        }
예제 #10
0
        /// <summary>
        /// Create a Hash byte array using Argon2id.
        /// </summary>
        /// <param name="passphrase"></param>
        /// <param name="salt"></param>
        /// <param name="size"></param>
        public static async Task <byte[]> GetHashKeyAsync(string passphrase, string salt, int size, HashOptions options = null)
        {
            using var argon2 = GetArgon2id(Encoding.UTF8.GetBytes(passphrase), Encoding.UTF8.GetBytes(salt), options);

            return(await argon2.GetBytesAsync(size).ConfigureAwait(false));
        }
예제 #11
0
        private static ExitCode RunHashOptionsAndReturnExitCode(HashOptions hashOptions)
        {
            GenericHashResult hashResult = null;

            switch (hashOptions.InputType.ToLower())
            {
            case "string":
            {
                hashResult = (hashOptions.Algorithm.ToLower()) switch
                {
                    "md5" => new MD5().ComputeHash(hashOptions.InputToComputeHash),
                    "sha1" => new SHA1().ComputeHash(hashOptions.InputToComputeHash),
                    "sha256" => new SHA256().ComputeHash(hashOptions.InputToComputeHash),
                    "sha384" => new SHA384().ComputeHash(hashOptions.InputToComputeHash),
                    "sha512" => new SHA512().ComputeHash(hashOptions.InputToComputeHash),
                    "pbkdf2" => new PBKDF2_HMAC_SHA_1().ComputeHash(hashOptions.InputToComputeHash),
                    "bcrypt" => new Hash.BCrypt().ComputeHash(hashOptions.InputToComputeHash),
                    _ => new GenericHashResult()
                    {
                        Success = false, Message = $"Unknown algorithm \"{hashOptions.Algorithm}\"."
                    },
                };
            }
            break;

            case "file":
            {
                switch (hashOptions.Algorithm.ToLower())
                {
                case "md5":
                {
                    using (var progressBar = new ProgressBar())
                    {
                        var md5 = new MD5();
                        md5.OnHashProgress += (percentageDone, message) => { progressBar.Report((double)percentageDone / 100); };
                        hashResult          = md5.ComputeFileHash(hashOptions.InputToComputeHash);
                    }
                }
                break;

                case "sha1":
                {
                    using (var progressBar = new ProgressBar())
                    {
                        var sha1 = new SHA1();
                        sha1.OnHashProgress += (percentageDone, message) => { progressBar.Report((double)percentageDone / 100); };
                        hashResult           = sha1.ComputeFileHash(hashOptions.InputToComputeHash);
                    }
                }
                break;

                case "sha256":
                {
                    using (var progressBar = new ProgressBar())
                    {
                        var sha256 = new SHA256();
                        sha256.OnHashProgress += (percentageDone, message) => { progressBar.Report((double)percentageDone / 100); };
                        hashResult             = sha256.ComputeFileHash(hashOptions.InputToComputeHash);
                    }
                }
                break;

                case "sha384":
                {
                    using (var progressBar = new ProgressBar())
                    {
                        var sha384 = new SHA384();
                        sha384.OnHashProgress += (percentageDone, message) => { progressBar.Report((double)percentageDone / 100); };
                        hashResult             = sha384.ComputeFileHash(hashOptions.InputToComputeHash);
                    }
                }
                break;

                case "sha512":
                {
                    using (var progressBar = new ProgressBar())
                    {
                        var sha512 = new SHA512();
                        sha512.OnHashProgress += (percentageDone, message) => { progressBar.Report((double)percentageDone / 100); };
                        hashResult             = sha512.ComputeFileHash(hashOptions.InputToComputeHash);
                    }
                }
                break;

                case "pbkdf2":
                case "bcrypt":
                    hashResult = new GenericHashResult()
                    {
                        Success = false, Message = $"Algorithm \"{hashOptions.Algorithm}\" currently not available for file hashing."
                    };
                    break;

                default:
                    hashResult = new GenericHashResult()
                    {
                        Success = false, Message = $"Unknown algorithm \"{hashOptions.Algorithm}\"."
                    };
                    break;
                }
            }
            break;

            default:
                hashResult = new GenericHashResult()
                {
                    Success = false, Message = $"Unknown input type \"{hashOptions.InputType}\"."
                };
                break;
            }

            if (hashResult.Success && !string.IsNullOrWhiteSpace(hashOptions.CompareHash))
            {
                var hashesMatch = (
                    hashOptions.Algorithm.ToLower() != "bcrypt" && hashOptions.Algorithm.ToLower() != "pbkdf2"
                        ? (hashResult.HashString).Equals(hashOptions.CompareHash, StringComparison.InvariantCultureIgnoreCase)
                        : (hashOptions.Algorithm.ToLower() == "bcrypt"
                            ? new Hash.BCrypt().VerifyHash(hashOptions.InputToComputeHash, hashOptions.CompareHash).Success
                            : new Hash.PBKDF2_HMAC_SHA_1().VerifyHash(hashOptions.InputToComputeHash, hashOptions.CompareHash).Success
                           )
                    );
                var outputMessage = (
                    hashesMatch
                        ? $"Computed hash MATCH with given hash: {(hashOptions.Algorithm.ToLower() != "bcrypt" ? hashResult.HashString : hashOptions.CompareHash)}"
                        : $"Computed hash DOES NOT MATCH with given hash." +
                    (
                        hashOptions.Algorithm.ToLower() != "bcrypt"
                                ? $"\nComputed hash: {hashResult.HashString}\nGiven hash: {hashOptions.CompareHash}"
                                : ""
                    )
                    );
                Console.WriteLine(outputMessage);

                return(hashesMatch ? ExitCode.Sucess : ExitCode.Error);
            }
            else if (hashResult.Success && string.IsNullOrWhiteSpace(hashOptions.CompareHash))
            {
                Console.WriteLine(hashResult.HashString);

                return(ExitCode.Sucess);
            }
            else
            {
                Console.WriteLine(hashResult.Message);

                return(ExitCode.Error);
            }
        }
예제 #12
0
 public HashService(HashOptions hashOptions)
 {
     _hashOptions = hashOptions ?? throw new ArgumentNullException(nameof(hashOptions));
 }
예제 #13
0
 public HashService(IOptions <HashOptions> options)
 {
     this.options = options.Value;
 }
예제 #14
0
        private static ExitCode RunHashOptionsAndReturnExitCode(HashOptions hashOptions)
        {
            GenericHashResult hashResult = null;

            switch (hashOptions.InputType.ToLower())
            {
            case "string":
            {
                switch (hashOptions.Algorithm.ToLower())
                {
                case "md5":
                    hashResult = new MD5().HashString(hashOptions.InputToBeHashed);
                    break;

                case "sha1":
                    hashResult = new SHA1().HashString(hashOptions.InputToBeHashed);
                    break;

                case "sha256":
                    hashResult = new SHA256().HashString(hashOptions.InputToBeHashed);
                    break;

                case "sha384":
                    hashResult = new SHA384().HashString(hashOptions.InputToBeHashed);
                    break;

                case "sha512":
                    hashResult = new SHA512().HashString(hashOptions.InputToBeHashed);
                    break;

                case "bcrypt":
                    hashResult = new Hash.BCrypt().HashString(hashOptions.InputToBeHashed);
                    break;

                default:
                    hashResult = new GenericHashResult()
                    {
                        Success = false, Message = $"Unknown algorithm \"{hashOptions.Algorithm}\"."
                    };
                    break;
                }
            }
            break;

            case "file":
            {
                switch (hashOptions.Algorithm.ToLower())
                {
                case "md5":
                    hashResult = new MD5().HashFile(hashOptions.InputToBeHashed, hashOptions.Verbose);
                    break;

                case "sha1":
                    hashResult = new SHA1().HashFile(hashOptions.InputToBeHashed, hashOptions.Verbose);
                    break;

                case "sha256":
                    hashResult = new SHA256().HashFile(hashOptions.InputToBeHashed, hashOptions.Verbose);
                    break;

                case "sha384":
                    hashResult = new SHA384().HashFile(hashOptions.InputToBeHashed, hashOptions.Verbose);
                    break;

                case "sha512":
                    hashResult = new SHA512().HashFile(hashOptions.InputToBeHashed, hashOptions.Verbose);
                    break;

                case "bcrypt":
                    hashResult = new GenericHashResult()
                    {
                        Success = false, Message = $"Algorithm \"{hashOptions.Algorithm}\" currently not available for file hashing."
                    };
                    break;

                default:
                    hashResult = new GenericHashResult()
                    {
                        Success = false, Message = $"Unknown algorithm \"{hashOptions.Algorithm}\"."
                    };
                    break;
                }
            }
            break;

            default:
                hashResult = new GenericHashResult()
                {
                    Success = false, Message = $"Unknown input type \"{hashOptions.InputType}\"."
                };
                break;
            }

            if (hashResult.Success && !string.IsNullOrWhiteSpace(hashOptions.CompareHash))
            {
                bool hashesMatch = (
                    hashOptions.Algorithm.ToLower() != "bcrypt"
                        ? (hashResult.Hash).Equals(hashOptions.CompareHash, StringComparison.InvariantCultureIgnoreCase)
                        : new Hash.BCrypt().Verify(hashOptions.InputToBeHashed, hashOptions.CompareHash).Success
                    );

                var outputMessage = (
                    hashesMatch
                        ? $"Computed hash MATCH with given hash: {(hashOptions.Algorithm.ToLower() != "bcrypt" ? hashResult.Hash : hashOptions.CompareHash)}"
                        : $"Computed hash DOES NOT MATCH with given hash." +
                    (
                        hashOptions.Algorithm.ToLower() != "bcrypt"
                                ? $"\nComputed hash: {hashResult.Hash}\nGiven hash: {hashOptions.CompareHash}"
                                : ""
                    )
                    );

                Console.WriteLine(outputMessage);

                return(hashesMatch ? ExitCode.Sucess : ExitCode.Error);
            }
            else if (hashResult.Success && string.IsNullOrWhiteSpace(hashOptions.CompareHash))
            {
                Console.WriteLine(hashResult.Hash);

                return(ExitCode.Sucess);
            }
            else
            {
                Console.WriteLine(hashResult.Message);

                return(ExitCode.Error);
            }
        }
예제 #15
0
 private static void Hash(HashOptions obj)
 {
     using var fileStream = new FileStream(obj.Source, FileMode.Open);
     Console.WriteLine(Hashing.ToString(xxHash64.ComputeHash(fileStream)));
 }