diff --git a/CHANGELOG.md b/CHANGELOG.md
index fdacb30e..9dad9c7d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,6 +14,7 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin
## Upcoming changes
* Fixed the `/respawn` command to permit respawning players from the console. (@hakusaro, @Kojirremer)
+* Removed the old password hashing system, which predated `bcrypt` hashes and allowed specifying the hash algorithm in the config file. This also removes the config option for setting the hash algorithm (`HashAlgorithm`). This is because it helps clear the way for .NET5/6 and OTAPI 3, and because `bcrypt` has been the default since TShock 4.3 in 2015. (@hakusaro)
## TShock 4.5.6
* Updated Linux guide. (@NezbednikSK)
diff --git a/TShockAPI/Configuration/TShockConfig.cs b/TShockAPI/Configuration/TShockConfig.cs
index 18499f87..eeb658c1 100644
--- a/TShockAPI/Configuration/TShockConfig.cs
+++ b/TShockAPI/Configuration/TShockConfig.cs
@@ -368,11 +368,6 @@ namespace TShockAPI.Configuration
[Description("The minimum password length for new user accounts. Can never be lower than 4.")]
public int MinimumPasswordLength = 4;
- /// The hash algorithm used to encrypt user passwords.
- /// Valid types: "sha512", "sha256" and "md5". Append with "-xp" for the xp supported algorithms.
- [Description("The hash algorithm used to encrypt user passwords. Valid types: \"sha512\", \"sha256\" and \"md5\". Append with \"-xp\" for the xp supported algorithms.")]
- public string HashAlgorithm = "sha512";
-
/// Determines the BCrypt work factor to use. If increased, all passwords will be upgraded to new work-factor on verify.
/// The number of computational rounds is 2^n. Increase with caution. Range: 5-31.
[Description("Determines the BCrypt work factor to use. If increased, all passwords will be upgraded to new work-factor on verify. The number of computational rounds is 2^n. Increase with caution. Range: 5-31.")]
diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs
index 49f6b73c..e2af578b 100644
--- a/TShockAPI/DB/UserManager.cs
+++ b/TShockAPI/DB/UserManager.cs
@@ -438,7 +438,7 @@ namespace TShockAPI.DB
{
try
{
- if (BCrypt.Net.BCrypt.Verify(password, Password))
+ if (BCrypt.Net.BCrypt.Verify(password, Password))
{
// If necessary, perform an upgrade to the highest work factor.
UpgradePasswordWorkFactor(password);
@@ -447,35 +447,12 @@ namespace TShockAPI.DB
}
catch (SaltParseException)
{
- if (String.Equals(HashPassword(password), Password, StringComparison.InvariantCultureIgnoreCase))
- {
- // The password is not stored using BCrypt; upgrade it to BCrypt immediately
- UpgradePasswordToBCrypt(password);
- return true;
- }
+ TShock.Log.ConsoleError("Error: Unable to verify the password hash for user {0} ({1})", Name, ID);
return false;
}
return false;
}
- /// Upgrades a password to BCrypt, from an insecure hashing algorithm.
- /// The raw user account password (unhashed) to upgrade
- protected void UpgradePasswordToBCrypt(string password)
- {
- // Save the old password, in the event that we have to revert changes.
- string oldpassword = Password;
-
- try
- {
- TShock.UserAccounts.SetUserAccountPassword(this, password);
- }
- catch (UserAccountManagerException e)
- {
- TShock.Log.ConsoleError(e.ToString());
- Password = oldpassword; // Revert changes
- }
- }
-
/// Upgrades a password to the highest work factor available in the config.
/// The raw user account password (unhashed) to upgrade
protected void UpgradePasswordWorkFactor(string password)
@@ -536,51 +513,6 @@ namespace TShockAPI.DB
Password = BCrypt.Net.BCrypt.HashPassword(password.Trim(), workFactor);
}
- ///
- /// A dictionary of hashing algorithms and an implementation object.
- ///
- protected readonly Dictionary> HashTypes = new Dictionary>
- {
- {"sha512", () => new SHA512Managed()},
- {"sha256", () => new SHA256Managed()},
- {"md5", () => new MD5Cng()},
- {"sha512-xp", () => SHA512.Create()},
- {"sha256-xp", () => SHA256.Create()},
- {"md5-xp", () => MD5.Create()},
- };
-
- ///
- /// Returns a hashed string for a given string based on the config file's hash algo
- ///
- /// bytes to hash
- /// string hash
- protected string HashPassword(byte[] bytes)
- {
- if (bytes == null)
- throw new NullReferenceException("bytes");
- Func func;
- if (!HashTypes.TryGetValue(TShock.Config.Settings.HashAlgorithm.ToLower(), out func))
- throw new NotSupportedException("Hashing algorithm {0} is not supported".SFormat(TShock.Config.Settings.HashAlgorithm.ToLower()));
-
- using (var hash = func())
- {
- var ret = hash.ComputeHash(bytes);
- return ret.Aggregate("", (s, b) => s + b.ToString("X2"));
- }
- }
-
- ///
- /// Returns a hashed string for a given string based on the config file's hash algo
- ///
- /// string to hash
- /// string hash
- protected string HashPassword(string password)
- {
- if (string.IsNullOrEmpty(password) && Password == "non-existant password")
- return "non-existant password";
- return HashPassword(Encoding.UTF8.GetBytes(password));
- }
-
#region IEquatable
/// Indicates whether the current is equal to another .