Skip to main content

Insecure encryption algorithm - MD5

Need

Implementation of secure encryption algorithms for password hashing

Context

  • Usage of Ruby for building dynamic and object-oriented applications
  • Usage of digest for generating hash values for data or messages

Description

Non compliant code

require 'digest/md5'

def hash_password(password)
return Digest::MD5.hexdigest(password)
end

The above code represents a weak password hashing mechanism in a Ruby on Rails application.

The function hash_password takes a plain text password as an input and returns an MD5 hash of the password. MD5 (Message Digest Algorithm 5) is a widely used cryptographic hash function that produces a 128-bit (16-byte) hash value. It is commonly used to verify data integrity.

However, MD5 is considered to be a weak hashing function for passwords due to its speed and therefore susceptibility to brute force attacks, and also because of its vulnerability to hash collisions. A hash collision occurs when two different inputs produce the same hash output. This is a problem for password storage, because it means that two different passwords could potentially match the same hash, and thus be considered equivalent.

The Digest::MD5.hexdigest(password) line of code is where the MD5 hashing takes place. The hexdigest function returns the hash as a string of hexadecimal digits.

This code is vulnerable because if an attacker gains access to the hashed passwords, they can easily crack them due to the weaknesses in the MD5 algorithm.

Steps

  • Replace the use of MD5 algorithm with a more secure hashing algorithm, such as bcrypt or Argon2.
  • Update the code to use the recommended hashing algorithm for password hashing.
  • Ensure that the new hashing algorithm is properly implemented and configured.
  • Consider adding additional security measures, such as salting the passwords, to further enhance the security of the password hashing process.
  • Update any existing user passwords in the database to be hashed using the new algorithm.
  • Communicate the changes to the users and encourage them to update their passwords.
  • Regularly review and update the password hashing mechanism to stay up-to-date with the latest security best practices.

Compliant code

require 'bcrypt'

def hash_password(password)
return BCrypt::Password.create(password)
end

The previous code was using the MD5 algorithm to hash passwords, which is considered insecure due to its vulnerability to collision attacks. In this updated code, we have replaced the MD5 algorithm with bcrypt, a much more secure password hashing algorithm.

Bcrypt is a password hashing function designed by Niels Provos and David Mazières, based on the Blowfish cipher. It incorporates a salt to protect against rainbow table attacks and is adaptive over time.

The BCrypt::Password.create(password) function automatically handles the creation of a salt, and then combines it with the user's password to produce a hashed password. The salt is a random string that is used to combine with the password to produce the hash. The salt is then stored with the hashed password. When checking a password, the system will combine the salt with the entered password, hash it, and then compare it to the stored hashed password.

This change significantly enhances the security of the password hashing process in the application. However, it's important to note that all existing user passwords in the database need to be updated to use the new bcrypt hashed passwords. Users should be informed about this change and encouraged to update their passwords.

Regularly reviewing and updating the password hashing mechanism is also recommended to stay up-to-date with the latest security best practices.

References