diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/Mk0.Tools.Password/Mk0.Tools.Password.sln b/Mk0.Tools.Password/Mk0.Tools.Password.sln new file mode 100644 index 0000000..c654293 --- /dev/null +++ b/Mk0.Tools.Password/Mk0.Tools.Password.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28010.2050 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mk0.Tools.Password", "Mk0.Tools.Password\Mk0.Tools.Password.csproj", "{B6F59B71-BD27-4D69-9D40-DD5820A0A645}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B6F59B71-BD27-4D69-9D40-DD5820A0A645}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B6F59B71-BD27-4D69-9D40-DD5820A0A645}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B6F59B71-BD27-4D69-9D40-DD5820A0A645}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B6F59B71-BD27-4D69-9D40-DD5820A0A645}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {039D5A9C-754B-47FC-A2D6-410CBEFF3286} + EndGlobalSection +EndGlobal diff --git a/Mk0.Tools.Password/Mk0.Tools.Password/Mk0.Tools.Password.csproj b/Mk0.Tools.Password/Mk0.Tools.Password/Mk0.Tools.Password.csproj new file mode 100644 index 0000000..8572be2 --- /dev/null +++ b/Mk0.Tools.Password/Mk0.Tools.Password/Mk0.Tools.Password.csproj @@ -0,0 +1,48 @@ + + + + + Debug + AnyCPU + {B6F59B71-BD27-4D69-9D40-DD5820A0A645} + Library + Properties + Mk0.Tools.Password + Mk0.Tools.Password + v4.6.1 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Mk0.Tools.Password/Mk0.Tools.Password/PasswordStrength.cs b/Mk0.Tools.Password/Mk0.Tools.Password/PasswordStrength.cs new file mode 100644 index 0000000..f73d4ea --- /dev/null +++ b/Mk0.Tools.Password/Mk0.Tools.Password/PasswordStrength.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; + +namespace Mk0.Tools.Password +{ + public class PasswordStrength + { + public double Score = 0; + + private int punkte = 0; + private double cardinality = 0; + + private bool hatNummer = false; + private bool hatLowercase = false; + private bool hatUppercase = false; + private bool hatSonderzeichen = false; + + public PasswordStrength(string password) + { + if (string.IsNullOrEmpty(password.Trim())) + { + punkte = 0; //kein Passwort + } + else + { + if (password.Trim().Length < 6) + { + punkte = 1; //zu kurz + } + else + { + punkte = 2; //min Länge erreicht + if (password.Trim().Length >= 8) //1 pkt für je 2 stellen + { + punkte += ((password.Trim().Length - 8) / 2) + 1; + } + if (Regex.IsMatch(password.Trim(), @"[\d]", RegexOptions.ECMAScript)) //hat nummern + { + punkte += 5; + hatNummer = true; + } + if (Regex.IsMatch(password.Trim(), @"[a-z]", RegexOptions.ECMAScript)) //hat lowercase + { + punkte += 5; + hatLowercase = true; + } + if (Regex.IsMatch(password, @"[A-Z]", RegexOptions.ECMAScript)) //hat uppercase + { + punkte += 5; + hatUppercase = true; + } + if (Regex.IsMatch(password, @"[~`!@#$%\^\&\*\(\)\-_\+=\[\{\]\}\|\\;:'\""<\,>\.\?\/£]", RegexOptions.ECMAScript)) //hat sonderzeichen + { + punkte += 10; + hatSonderzeichen = true; + } + List lstPass = password.Trim().ToList(); //länger als 2 zeichen und 3 wiederholende zeichen -2 + if (lstPass.Count >= 3) + { + for (int i = 2; i < lstPass.Count; i++) + { + char charCurrent = lstPass[i]; + if (charCurrent == lstPass[i - 1] && charCurrent == lstPass[i - 2] && punkte >= 4) + { + punkte -= 3; + } + } + } + } + } + CalculateEntropy(password.Trim()); + Score = (punkte + cardinality) / 2; + } + + public void CalculateEntropy(string password) + { + var cardinality = 0; + + if (password.Length >= 6 && hatLowercase && hatNummer && hatSonderzeichen && hatUppercase) + { + // Password contains lowercase letters. + if (password.Any(c => char.IsLower(c))) + { + cardinality = 26; + } + + // Password contains uppercase letters. + if (password.Any(c => char.IsUpper(c))) + { + cardinality += 26; + } + + // Password contains numbers. + if (password.Any(c => char.IsDigit(c))) + { + cardinality += 10; + } + + // Password contains symbols. + if (password.IndexOfAny("\\|¬¦`!\"£$%^&*()_+-=[]{};:'@#~<>,./? ".ToCharArray()) >= 0) + { + cardinality += 36; + } + + this.cardinality = Math.Log(cardinality, 2) * password.Length; + } + } + } +} diff --git a/Mk0.Tools.Password/Mk0.Tools.Password/Properties/AssemblyInfo.cs b/Mk0.Tools.Password/Mk0.Tools.Password/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..8aa3779 --- /dev/null +++ b/Mk0.Tools.Password/Mk0.Tools.Password/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die einer Assembly zugeordnet sind. +[assembly: AssemblyTitle("Mk0.Tools.Password")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Mk0.Tools.Password")] +[assembly: AssemblyCopyright("Copyright © 2019 mk0.at")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly +// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von +// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("b6f59b71-bd27-4d69-9d40-dd5820a0a645")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, +// indem Sie "*" wie unten gezeigt eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")]