Foros del Web » Programación para mayores de 30 ;) » .NET »

Clase para cifrar en SHA1

Estas en el tema de Clase para cifrar en SHA1 en el foro de .NET en Foros del Web. Hola a todos. Estoy intentando crear una bibliteca de clases para poder utilizarla luego en ASP 3.0. Se trata de un componente que me permita ...
  #1 (permalink)  
Antiguo 17/10/2005, 04:11
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Clase para cifrar en SHA1

Hola a todos. Estoy intentando crear una bibliteca de clases para poder utilizarla luego en ASP 3.0. Se trata de un componente que me permita cifrar en SHA1, ya que con ASP 3 no se puede, al menos que yo sepa.

Pues bien, creo un nuevo proyecto de Biblioteca de clases llamado "Cifrados". Añado una nueva clase y escribo el siguiente código:

Código:
Imports System.Security.Cryptography

Public Class CifSha1

    Public Function Cifrar(ByVal Cadena As String) As String

        Dim CadenaEnBytes As Byte()
        Dim HashEnBytes As Byte() 'Resultado en Bytes
        Dim HashCadena As String 'Resultado de HASH

        Dim Sha1 As New SHA1CryptoServiceProvider
        CadenaEnBytes = System.Text.Encoding.ASCII.GetBytes(Cadena)
        HashEnBytes = Sha1.ComputeHash(CadenaEnBytes)
        HashCadena = System.Text.Encoding.ASCII.GetString(HashEnBytes)

        Return "SHA1: " & HashCadena

    End Function


End Class
Lo compilo y en un proyecto web ASP.Net lo pruebo de la siguiente manera. Agrego la referencia a Cifrados.dll y escribo lo siguiente:

Código:
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim sha1 As New Cifrados.CifSha1
        Response.Write(sha1.Cifrar("contraseñaParaSerCifrada"))

    End Sub
El resultado de la página es:

Código:
SHA1: (VHrs??h?u? ????w?
Lo que no coincide con el cifrado, que debería ser:

Código:
SHA1: 47914D69E0FC735EDC76155944F1360167FB82C2
Supongo que será problema de la codificación, pero he probado con ASCII, UTF8, UTF7 y Default obteniendo cosas distintas pero nunca la correcta.

Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #2 (permalink)  
Antiguo 17/10/2005, 04:57
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Resuelto. El problema es que no pasaba los bytes a cadena correctamente, así que he optado por hacerlo uno por uno. La clase final quedaría así:

Código:
Imports System.Security.Cryptography

Public Class CifSha1

    Public Function Cifrar(ByVal Cadena As String, ByVal Codificacion As String) As String

        Dim CadenaEnBytes As Byte()
        Dim HashEnBytes As Byte() 'Resultado en Bytes
        Dim HashCadena As String 'Resultado de HASH

        Dim Sha1 As New SHA1CryptoServiceProvider
        CadenaEnBytes = System.Text.Encoding.GetEncoding(Codificacion).GetBytes(Cadena)
        HashEnBytes = Sha1.ComputeHash(CadenaEnBytes)

        Dim i As Integer
        Dim sbSalida As New System.Text.StringBuilder(HashEnBytes.Length)
        For i = 0 To HashEnBytes.Length - 1
            sbSalida.Append(HashEnBytes(i).ToString("X2"))
        Next
        HashCadena = sbSalida.ToString()

        Return HashCadena

    End Function


End Class
Y para usarla:

Código:
        Dim sha1 As New Cifrados.CifSha1
        Response.Write("UTF-8: " & sha1.Cifrar("contraseñaParaSerCifrada", "UTF-8") & "<br>")
        Response.Write("UTF-7: " & sha1.Cifrar("contraseñaParaSerCifrada", "UTF-7") & "<br>")
        Response.Write("ASCII: " & sha1.Cifrar("contraseñaParaSerCifrada", "ASCII") & "<br>")
Espero que le sirva a alguien. Por cierto, ya que estamos, para usarla en ASP 3 además de registrar la dll en el servidor debería usar sólo esto ¿no?

Código:
Set sha1 = New Server.CreateObject("Cifrados.CifSha1")
Response.Write(sha1.Cifrar("contraseñaParaSerCifrada", "UTF-8"))
Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #3 (permalink)  
Antiguo 19/10/2005, 02:12
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Todo ha funcionado perfectamente en el equipo en el que trabajo. Uso VS.Net y la dll se registra sola al compilarla, por lo que la puedo usar sin problemas desde ASP 3.0. El problema es cuando intento registrarla en otro equipo con regsrv32, me sale el siguiente error:

Cifrados.dll se cargó, pero no se encontró el punto de entrada DllRegisterServer

En la ayuda del MSDN viene una lista de errores al usar regsrv32 pero no viene la solución a este problema. Por tanto, lo que hice fue exportar las claves del registro que se habían creado en mi equipo y ejecutarlas en el otro, cambiando las rutas que hacían referencia a la ubicación de la dll. Todo funcionó bien.

¿Y dónde está el problema? Pues que he intentando registrarla en un servidor Arsys y me dice el servicio técnico que les da el mismo problema. Me da la impresión de que se me ha olvidado algo de código en la la librería, algo como esto, aunque no se muy bien para que sirve:

Declare Function Ciofrados Lib "Cifrados.dll" Alias "Cifrados" () As Long

¿Puede ser eso el dichoso punto de entrada que no se encuentra?

Gracias y un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #4 (permalink)  
Antiguo 19/10/2005, 12:24
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Ya leíste éste artículo..

http://support.microsoft.com/kb/q249873/

Espeor te sirva de algo..
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #5 (permalink)  
Antiguo 20/10/2005, 02:39
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Sí lo leí, aunque como siempre por encima. La cuestión es que no había incluido la función DLLSelfRegister en la clase (todavía sigo sin saber cómo hacerlo). No obstante xknown me dio la clave en este otro tema. La solución que me ha dado es buena, aunque creo que el administrador del hosting en el que quiero registrar la Dll me va a poner problemas a la hora de utilizar regasm en lugar de resvr, aunque el servidor tenga .Net.

Gracias por tu ayuda. UN saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:43.