Hola, chicos,
¡Buen día!

En esta publicación rápida, le demostraré cómo crear un pequeño generador de contraseñas aleatorias, para utilizarlo de las más diversas formas. Haré que este script esté disponible usando los lenguajes C# (para usar en SQL Server, con CLR), PHP y Transact-SQL.

Estos scripts son muy simples, pero la idea es demostrar cómo usar esta característica en las 3 tecnologías principales que uso.

Cómo crear un generador de contraseñas escrito en PHP

php-random-password-generator-with-php
php-generador-de-contraseñas-aleatorias-con-php

Código fuente:

<?php

function fncGera_Senha( $Qt_Caracteres, $Fl_Letras, $Fl_Maiusculas, $Fl_Numeros, $Fl_Simbolos )
{

    if ( $Qt_Caracteres == 0 )
    {
        return null;
    }

    if ( !$Fl_Letras && !$Fl_Numeros && !$Fl_Simbolos )
    {
        return null;
    }


    $caracteresValidos = "";

    if ( $Fl_Letras )
    {
        $caracteresValidos .= "abcdefghijklmnopqrstuvwxyz";
    }

    if ( $Fl_Letras && $Fl_Maiusculas )
    {
        $caracteresValidos .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    }

    if ( $Fl_Numeros )
    {
        $caracteresValidos .= "1234567890";
    }

    if ( $Fl_Simbolos )
    {
        $caracteresValidos .= "!@#$%&*()_+-={}/\<>?§£¢¬|.,;:";
    }


    $valormaximo = strlen( $caracteresValidos );
    $senha = "";

    for ( $i = 0; $i < $Qt_Caracteres; $i++ )
    {
        $senha .= $caracteresValidos[rand( 0, $valormaximo - 1 )];
    }

    return $senha;

}

echo "Exemplo 1: " . fncGera_Senha(10, 1, 1, 1, 1) . "<br/>";
echo "Exemplo 2: " . fncGera_Senha(8, 1, 0, 1, 0) . "<br/>";
echo "Exemplo 3: " . fncGera_Senha(4, 1, 1, 0, 0) . "<br/>";

Cómo crear un generador de contraseñas escrito en C# (con CLR)

sql-server-random-password-generator-with-clr-csharp-c
Generador-de-contraseñas-aleatorias-de-servidor-sql-con-clr-csharp-c

Código fuente:

using System;
using System.Text;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static string fncGera_Senha(int Qt_Caracteres, bool Fl_Letras, bool Fl_Maiusculas, bool Fl_Numeros, bool Fl_Simbolos)
    {

        if (Qt_Caracteres == 0)
            return null;

        if (!Fl_Letras && !Fl_Numeros && !Fl_Simbolos)
            return null;


        var caracteresValidos = "";

        if (Fl_Letras)
            caracteresValidos += "abcdefghijklmnopqrstuvwxyz";

        if (Fl_Letras && Fl_Maiusculas)
            caracteresValidos += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        if (Fl_Numeros)
            caracteresValidos += "1234567890";

        if (Fl_Simbolos)
            caracteresValidos += @"!@#$%&*()_+-={}/\<>?§£¢¬|.,;:?";


        var valormaximo = caracteresValidos.Length;
        var random = new Random(DateTime.Now.Millisecond);
        var senha = new StringBuilder(Qt_Caracteres);

        for (var i = 0; i < Qt_Caracteres; i++)
            senha.Append(caracteresValidos[random.Next(0, valormaximo)]);

        return senha.ToString();

    }

}

Cómo crear un generador de contraseñas escrito en Transact-SQL (TSQL)

sql-server-random-password-generator-with-transact-sql-tsql
generador-de-contraseñas-aleatorias-del-servidor-sql-con-transact-sql-tsql

código fuente

CREATE FUNCTION dbo.fncGera_Senha(
    @Qt_Caracteres INT, 
    @Fl_Letras BIT, 
    @Fl_Maiusculas BIT, 
    @Fl_Numeros BIT, 
    @Fl_Simbolos BIT
)
RETURNS VARCHAR(MAX)
AS BEGIN
    
    IF (@Qt_Caracteres = 0)
        RETURN NULL

    IF (@Fl_Letras = 0 AND @Fl_Numeros = 0 AND @Fl_Simbolos = 0)
        RETURN NULL


    DECLARE @caracteresValidos VARCHAR(MAX) = ''

    IF (@Fl_Letras = 1)
        SET @caracteresValidos += 'abcdefghijklmnopqrstuvwxyz'

    IF (@Fl_Letras = 1 AND @Fl_Maiusculas = 1)
        SET @caracteresValidos += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

    IF (@Fl_Numeros = 1)
        SET @caracteresValidos += '1234567890'

    IF (@Fl_Simbolos = 1)
        SET @caracteresValidos += '"!@#$%&*()_+-={}/\<>?§£¢¬|.,;:?'

    
    DECLARE 
        @valormaximo INT = LEN(@caracteresValidos),
        @i INT = 1,
        @Senha VARCHAR(MAX) = ''
    

    WHILE(@i <= @Qt_Caracteres)
    BEGIN
        
        -- Não é permitido utilizar a função RAND() dentro de UDF. Ou se cria uma view com a função RAND() ou utiliza a solução abaixo
        SET @Senha += SUBSTRING(@caracteresValidos, CAST(((ABS(CHECKSUM(PWDENCRYPT(N''))) / 2147483647.0) * @valormaximo) + 1 AS INT), 1)
        SET @i += 1

    END

    RETURN @senha

END

Como habrás notado en el comentario de la función, no es posible utilizar la función RAND() dentro de las funciones UDF. Si intenta hacerlo, SQL Server devolverá este mensaje de error:

Mensaje 443, Nivel 16, Estado 1, Procedimiento fncGera_Password, Línea 50
Uso no válido de un operador de efecto secundario 'rand' dentro de una función.

Para solucionar esto, vea más accediendo a la publicación. SQL Server: mensaje 443 Uso no válido de un operador de efectos secundarios "rand" dentro de una función.

¡Eso es todo, amigos!
Espero que hayas disfrutado del post y hasta la próxima.

php c# csharp generador de contraseñas de cadenas aleatorias

php c# csharp generador de contraseñas de cadenas aleatorias