asp.net - golang - hmac sha256 kotlin
Reimplementar la membresía de ASP.NET y la contraseña de usuario Hashing en Ruby (4)
Eres muy cercano. Desafortunadamente, Ruby no tiene soporte para Unicode incorporado en este momento, y tu función de hashing depende de ello. Hay soluciones. Mire alrededor del sitio sobre cómo hacer unicode en Ruby. Por cierto, creo que olvidó decodificar la sal base64, parece que la función ASP.net hace eso.
Tengo una gran base de datos de usuarios (~ 200,000) que estoy transfiriendo desde una aplicación ASP.NET a una aplicación Ruby on Rails. Realmente no quiero pedirle a cada usuario que restablezca su contraseña, así que estoy tratando de volver a implementar la función de hashing de contraseñas de C # en Ruby.
La vieja función es esta:
public string EncodePassword(string pass, string saltBase64)
{
byte[] bytes = Encoding.Unicode.GetBytes(pass);
byte[] src = Convert.FromBase64String(saltBase64);
byte[] dst = new byte[src.Length + bytes.Length];
Buffer.BlockCopy(src, 0, dst, 0, src.Length);
Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
byte[] inArray = algorithm.ComputeHash(dst);
return Convert.ToBase64String(inArray);
}
Un ejemplo de hash de contraseña y sal es (y la contraseña utilizada es "contraseña"):
Contraseña hash: "weEWx4rhyPtd3kec7usysxf7kpk =" Salt: "1ptFxHq7ALe7yXIQDdzQ9Q ==" Contraseña: "contraseña"
Ahora con el siguiente código de Ruby:
require "base64"
require "digest/sha1"
password = "password"
salt = "1ptFxHq7ALe7yXIQDdzQ9Q=="
concat = salt+password
sha1 = Digest::SHA1.digest(concat)
encoded = Base64.encode64(sha1)
puts encoded
No obtengo el hash de contraseña correcto (obtengo "+ BsdIOBN / Vh2U7qWG4e + O13h3iQ =" en lugar de "weEWx4rhyPtd3kec7usysxf7kpk ="). ¿Alguien puede ver cuál podría ser el problema?
Muchas gracias
Arfon
Necesita descodificar la sal para convertirla a su representación de bytes y luego concatenarla con la contraseña para obtener el valor de la contraseña hash. Estás utilizando la cadena de sal de codificación directamente (que es una sal diferente) y, por lo tanto, se trata de algo diferente.
require "base64"
require "digest/sha1"
password = "password"
salt = Base64.decode64("1ptFxHq7ALe7yXIQDdzQ9Q==")
concat = salt+password
sha1 = Digest::SHA1.digest(concat)
encoded = Base64.encode64(sha1)
puts encoded
Solo una actualización rápida, un colega mío ha resuelto esto:
require "base64"
require "digest"
require "jcode"
def encode_password(password, salt)
bytes = ""
password.each_char { |c| bytes += c + "/x00" }
salty = Base64.decode64(salt)
concat = salty+bytes
sha1 = Digest::SHA1.digest(concat)
encoded = Base64.encode64(sha1).strip()
puts encoded
end
Me han encomendado migrar una aplicación .NET existente a Ruby on Rails. Estoy usando el código a continuación para imitar el hashing de la contraseña .NET. Soy muy nuevo para Ruby, y no conozco .NET en absoluto. Es posible que el código no sea tan limpio como podría, pero es un comienzo.
Para probar, guárdelo como un script de Ruby y ejecútelo con:
ruby script plain_text_password salt_in_base64
p.ej
ruby dotNetHash.rb contraseña123 LU7hUk4MXAvlq6DksvP9SQ ==
require "base64"
require "digest"
# Encode password as double-width characters
password_as_text = ARGV.first
double_width_password = []
double_width_password = password_as_text.encode("UTF-16LE").bytes.to_a
# Unencode the salt
salt = Base64.decode64(ARGV[1])
# Concatenate salt+pass
salt_pass_array = []
salt_pass_array = salt.bytes.to_a + double_width_password
# Repack array as string and hash it. Then encode.
salt_pass_str = salt_pass_array.pack(''C*'')
sha1_saltpass = Digest::SHA1.digest(salt_pass_str)
enc_sha1_saltpass = Base64.encode64(sha1_saltpass).strip()
puts "Encoded SHA1 saltpass is " + enc_sha1_saltpass