Saltar al pie de página
.NET AYUDA

RandomNumberGenerator C#

A veces, al trabajar con documentos PDF, puedes encontrarte necesitando generar números aleatorios o cadenas aleatorias. Ya sea que estés generando números aleatorios y contraseñas para la encriptación de PDF, creando nombres de archivo únicos, evitando secuencias predecibles, o necesites generar números por cualquier otra razón, usar la clase RandomNumberGenerator de C# puede ayudar a llevar tus proyectos de generación y edición de PDF al siguiente nivel.

A diferencia de un objeto aleatorio básico creado a partir de la clase Random, este generador de números aleatorios criptográfico produce valores aleatorios criptográficamente fuertes, adecuados para operaciones criptográficas en aplicaciones seguras.

En este artículo, exploraremos:

  • Qué es RandomNumberGenerator y por qué es importante.

  • Cómo usar un generador de números aleatorios criptográfico en C# para generar números aleatorios, cadenas aleatorias y otros datos aleatorios para propósitos criptográficos.

  • Ejemplos prácticos de cómo integrar RandomNumberGenerator con IronPDF para crear PDFs únicos y seguros usando los números y cadenas generados.

  • Consejos y mejores prácticas para aumentar la seguridad y el profesionalismo en tus aplicaciones PDF.

Qué es la clase RandomNumberGenerator

Antes de profundizar en la integración con IronPDF, revisemos brevemente qué hace especial a RandomNumberGenerator.

  • Es parte del espacio de nombres System.Security.Cryptography.

  • Genera valores aleatorios criptográficamente fuertes como bytes aleatorios, mucho más seguros que la clase Random típica.

  • Es ideal para escenarios que requieren imprevisibilidad, como la generación de tokens, claves, sales e identificadores únicos seguros.

  • Usa algoritmos criptográficos como AES-CTR DRBG, Fortuna, o CSPRNGs proporcionados por el sistema operativo. Haciéndolo resistente a la predicción.

  • Mejor utilizado para tareas como crear claves criptográficas, generación de contraseñas, tokens seguros e IDs de documentos únicos.

Esta fortaleza proviene de confiar en los generadores de números aleatorios seguros subyacentes del sistema operativo, haciéndolo resistente a ataques de predicción o ingeniería inversa. A diferencia de los generadores de números pseudoaleatorios que pueden producir la misma secuencia con el mismo valor de semilla, esta clase está diseñada para producir verdadera aleatoriedad y para propósitos criptográficos.

¿Por qué usar RandomNumberGenerator en lugar de la clase Random de C#?

Muchos desarrolladores comienzan con la clase Random de C# para generar enteros aleatorios, pero no está diseñada para escenarios de alta seguridad. Los patrones en su salida pueden ser predecibles, especialmente si se usa el mismo valor de semilla o el tiempo del sistema, lo que significa que los números generados podrían ser adivinados. Esto ocurre porque el método genera valores usando simples operaciones aritméticas modulares que pueden repetirse con la misma entrada.

En contraste, RandomNumberGenerator produce números verdaderamente aleatorios, derivados de generadores de números aleatorios criptográficos en el .NET Framework o el sistema operativo subyacente. Esto asegura que no haya sesgo de valor bajo y frecuentemente usa una estrategia de descartar y volver a intentar para mantener una distribución uniforme entre un límite inferior (por ejemplo, int minValue) y un límite superior exclusivo (por ejemplo, int maxValue). La ilustración a continuación destaca la diferencia entre un RNG débil y uno seguro.

Débil vs. RNG seguro

Por qué usar RandomNumberGenerator con IronPDF

IronPDF es una robusta biblioteca PDF de .NET que permite a los desarrolladores crear, editar y asegurar documentos PDF. Casos de uso común donde la aleatoriedad importa incluyen:

  • Documentos identificadores únicos: Adjuntar IDs criptográficamente seguros a PDFs para rastreo o validación.

  • Marcas de agua seguras: Incrustar marcas de agua o códigos aleatorios que disuaden la falsificación.

  • Claves de cifrado o contraseñas: Generar claves o contraseñas seguras para el cifrado de PDF.

  • Contenido aleatorio: Agregar tokens únicos o sales a documentos PDF para la verificación de integridad.

Cómo generar datos aleatorios seguros en C

Aquí tienes un ejemplo simple de cómo generar un token seguro de 128 bits (16 bytes).

using System;
using System.Security.Cryptography;

public static string GenerateSecureToken(int size = 16)
{
    byte[] randomBytes = new byte[size];
    RandomNumberGenerator.Fill(randomBytes);
    return Convert.ToBase64String(randomBytes);
}
using System;
using System.Security.Cryptography;

public static string GenerateSecureToken(int size = 16)
{
    byte[] randomBytes = new byte[size];
    RandomNumberGenerator.Fill(randomBytes);
    return Convert.ToBase64String(randomBytes);
}
Imports System
Imports System.Security.Cryptography

Public Shared Function GenerateSecureToken(Optional ByVal size As Integer = 16) As String
	Dim randomBytes(size - 1) As Byte
	RandomNumberGenerator.Fill(randomBytes)
	Return Convert.ToBase64String(randomBytes)
End Function
$vbLabelText   $csharpLabel

Este método crea un arreglo de bytes seguro y lo devuelve como una cadena Base64 — perfecto para incrustar o rastrear en pruebas unitarias, nombres de archivo o IDs seguros.

Ejemplo práctico: Cómo añadir identificadores de documento únicos a documentos PDF

Combinemos la potencia de RandomNumberGenerator e IronPDF para generar un PDF con un ID de documento único y seguro estampado en cada página.

Paso 1: Generar un ID de documento seguro

string GenerateDocumentId()
{
    byte[] idBytes = new byte[12]; // 96-bit ID
    RandomNumberGenerator.Fill(idBytes);
    return BitConverter.ToString(idBytes).Replace("-", "");
}
string GenerateDocumentId()
{
    byte[] idBytes = new byte[12]; // 96-bit ID
    RandomNumberGenerator.Fill(idBytes);
    return BitConverter.ToString(idBytes).Replace("-", "");
}
Private Function GenerateDocumentId() As String
	Dim idBytes(11) As Byte ' 96-bit ID
	RandomNumberGenerator.Fill(idBytes)
	Return BitConverter.ToString(idBytes).Replace("-", "")
End Function
$vbLabelText   $csharpLabel

Esto produce una cadena aleatoria hexadecimal de 24 caracteres (ej. "4F3A2C9B7D1E8F0A5B6C7D8E").

Paso 2: Crear el PDF y sellar el ID

using IronPdf;

void CreatePdfWithSecureId()
{
    var documentId = GenerateDocumentId();

    var renderer = new ChromePdfRenderer();

    // Add a custom footer with the document ID
    renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
    {
        HtmlFragment = $"<div style='text-align: center; font-size: 10px;'>Document ID: {documentId} - Generated on {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC</div>",
        DrawDividerLine = true,
    };
    var pdf = renderer.RenderHtmlAsPdf($"<h1>Secure Document</h1><p>Document ID: {documentId}</p>");

    string outputPath = $"SecurePdf_{documentId}.pdf";
    pdf.SaveAs(outputPath);

    Console.WriteLine($"PDF saved as {outputPath}");
}What this Code Does:
using IronPdf;

void CreatePdfWithSecureId()
{
    var documentId = GenerateDocumentId();

    var renderer = new ChromePdfRenderer();

    // Add a custom footer with the document ID
    renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
    {
        HtmlFragment = $"<div style='text-align: center; font-size: 10px;'>Document ID: {documentId} - Generated on {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC</div>",
        DrawDividerLine = true,
    };
    var pdf = renderer.RenderHtmlAsPdf($"<h1>Secure Document</h1><p>Document ID: {documentId}</p>");

    string outputPath = $"SecurePdf_{documentId}.pdf";
    pdf.SaveAs(outputPath);

    Console.WriteLine($"PDF saved as {outputPath}");
}What this Code Does:
Imports IronPdf

Private Sub CreatePdfWithSecureId()
	Dim documentId = GenerateDocumentId()

	Dim renderer = New ChromePdfRenderer()

	' Add a custom footer with the document ID
	renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
		.HtmlFragment = $"<div style='text-align: center; font-size: 10px;'>Document ID: {documentId} - Generated on {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC</div>",
		.DrawDividerLine = True
	}
	Dim pdf = renderer.RenderHtmlAsPdf($"<h1>Secure Document</h1><p>Document ID: {documentId}</p>")

	Dim outputPath As String = $"SecurePdf_{documentId}.pdf"
	pdf.SaveAs(outputPath)

	Console.WriteLine($"PDF saved as {outputPath}")
End Sub
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'What Me Code Does:
$vbLabelText   $csharpLabel
  • Genera un número aleatorio para un ID de documento único y seguro criptográficamente.

  • Renderiza un HTML a PDF incrustando ese ID.

  • Agrega un pie de página en cada página con el ID del documento y la marca de tiempo.

  • Guarda el PDF usando el ID en el nombre de archivo para un fácil rastreo.

Ejemplo de código completo

using IronPdf;
using IronPdf.Editing;
using System;
using System.Security.Cryptography;

class Program
{
    public static void Main(string[] args)
    {
        // Create an instance of Program to run non-static methods
        var program = new Program();
        program.CreatePdfWithSecureId()
    }

    string GenerateDocumentId()
    {
        byte[] idBytes = new byte[12]; // 96-bit ID
        RandomNumberGenerator.Fill(idBytes);
        return BitConverter.ToString(idBytes).Replace("-", "");
    }

    void CreatePdfWithSecureId()
    {
        var documentId = GenerateDocumentId();

        var renderer = new ChromePdfRenderer();
        // Add a custom footer with the document ID
        renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
        {
            HtmlFragment = $"<div style='text-align: center; font-size: 10px;'>Document ID: {documentId} - Generated on {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC</div>",
            DrawDividerLine = true,
        };
        var pdf = renderer.RenderHtmlAsPdf($"<h1>Secure Document</h1><p>Document ID: {documentId}</p>");

        string outputPath = $"SecurePdf_{documentId}.pdf";
        pdf.SaveAs(outputPath);

        Console.WriteLine($"PDF saved as {outputPath}");
    }
}
using IronPdf;
using IronPdf.Editing;
using System;
using System.Security.Cryptography;

class Program
{
    public static void Main(string[] args)
    {
        // Create an instance of Program to run non-static methods
        var program = new Program();
        program.CreatePdfWithSecureId()
    }

    string GenerateDocumentId()
    {
        byte[] idBytes = new byte[12]; // 96-bit ID
        RandomNumberGenerator.Fill(idBytes);
        return BitConverter.ToString(idBytes).Replace("-", "");
    }

    void CreatePdfWithSecureId()
    {
        var documentId = GenerateDocumentId();

        var renderer = new ChromePdfRenderer();
        // Add a custom footer with the document ID
        renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
        {
            HtmlFragment = $"<div style='text-align: center; font-size: 10px;'>Document ID: {documentId} - Generated on {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC</div>",
            DrawDividerLine = true,
        };
        var pdf = renderer.RenderHtmlAsPdf($"<h1>Secure Document</h1><p>Document ID: {documentId}</p>");

        string outputPath = $"SecurePdf_{documentId}.pdf";
        pdf.SaveAs(outputPath);

        Console.WriteLine($"PDF saved as {outputPath}");
    }
}
Imports IronPdf
Imports IronPdf.Editing
Imports System
Imports System.Security.Cryptography

Friend Class Program
	Public Shared Sub Main(ByVal args() As String)
		' Create an instance of Program to run non-static methods
'INSTANT VB NOTE: The variable program was renamed since it may cause conflicts with calls to static members of the user-defined type with this name:
		Dim program_Conflict As New Program()
		program_Conflict.CreatePdfWithSecureId()
	End Sub

	Private Function GenerateDocumentId() As String
		Dim idBytes(11) As Byte ' 96-bit ID
		RandomNumberGenerator.Fill(idBytes)
		Return BitConverter.ToString(idBytes).Replace("-", "")
	End Function

	Private Sub CreatePdfWithSecureId()
		Dim documentId = GenerateDocumentId()

		Dim renderer = New ChromePdfRenderer()
		' Add a custom footer with the document ID
		renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
			.HtmlFragment = $"<div style='text-align: center; font-size: 10px;'>Document ID: {documentId} - Generated on {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC</div>",
			.DrawDividerLine = True
		}
		Dim pdf = renderer.RenderHtmlAsPdf($"<h1>Secure Document</h1><p>Document ID: {documentId}</p>")

		Dim outputPath As String = $"SecurePdf_{documentId}.pdf"
		pdf.SaveAs(outputPath)

		Console.WriteLine($"PDF saved as {outputPath}")
	End Sub
End Class
$vbLabelText   $csharpLabel

Resultado

PDF con ID de documento

Caso de uso avanzado: cifrado seguro de PDF con claves aleatorias

IronPDF soporta cifrado de PDF, ofreciendo un fuerte soporte para la creación segura de PDFs. Puedes usar RandomNumberGenerator para crear contraseñas o claves fuertes para el cifrado:

using IronPdf;
using IronPdf.Editing;
using System;
using System.Security.Cryptography;

class Program
{
    public static void Main(string[] args)
    {
        // Create an instance of Program to run non-static methods
        var program = new Program();
        program.CreateEncryptedPdf();
    }

    string GenerateSecurePassword(int length = 12)
    {
        const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()";
        byte[] data = new byte[length];
        RandomNumberGenerator.Fill(data);

        char[] result = new char[length];
        for (int i = 0; i < length; i++)
        {
            result[i] = chars[data[i] % chars.Length];
        }
        return new string(result);
    }

    void CreateEncryptedPdf()
    {
        string password = GenerateSecurePassword();

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential PDF</h1><p>Access is restricted.</p>");

        // Set security settings
        pdf.SecuritySettings.UserPassword = password;
        pdf.SecuritySettings.AllowUserAnnotations = false;
        pdf.SecuritySettings.AllowUserCopyPasteContent = false;
        pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint;

        string filePath = "EncryptedSecurePdf.pdf";
        pdf.SaveAs(filePath);

        Console.WriteLine($"Encrypted PDF saved to {filePath} with password: {password}");
    }
}
using IronPdf;
using IronPdf.Editing;
using System;
using System.Security.Cryptography;

class Program
{
    public static void Main(string[] args)
    {
        // Create an instance of Program to run non-static methods
        var program = new Program();
        program.CreateEncryptedPdf();
    }

    string GenerateSecurePassword(int length = 12)
    {
        const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()";
        byte[] data = new byte[length];
        RandomNumberGenerator.Fill(data);

        char[] result = new char[length];
        for (int i = 0; i < length; i++)
        {
            result[i] = chars[data[i] % chars.Length];
        }
        return new string(result);
    }

    void CreateEncryptedPdf()
    {
        string password = GenerateSecurePassword();

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential PDF</h1><p>Access is restricted.</p>");

        // Set security settings
        pdf.SecuritySettings.UserPassword = password;
        pdf.SecuritySettings.AllowUserAnnotations = false;
        pdf.SecuritySettings.AllowUserCopyPasteContent = false;
        pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint;

        string filePath = "EncryptedSecurePdf.pdf";
        pdf.SaveAs(filePath);

        Console.WriteLine($"Encrypted PDF saved to {filePath} with password: {password}");
    }
}
Imports IronPdf
Imports IronPdf.Editing
Imports System
Imports System.Security.Cryptography

Friend Class Program
	Public Shared Sub Main(ByVal args() As String)
		' Create an instance of Program to run non-static methods
'INSTANT VB NOTE: The variable program was renamed since it may cause conflicts with calls to static members of the user-defined type with this name:
		Dim program_Conflict As New Program()
		program_Conflict.CreateEncryptedPdf()
	End Sub

	Private Function GenerateSecurePassword(Optional ByVal length As Integer = 12) As String
		Const chars As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()"
		Dim data(length - 1) As Byte
		RandomNumberGenerator.Fill(data)

		Dim result(length - 1) As Char
		For i As Integer = 0 To length - 1
			result(i) = chars.Chars(data(i) Mod chars.Length)
		Next i
		Return New String(result)
	End Function

	Private Sub CreateEncryptedPdf()
		Dim password As String = GenerateSecurePassword()

		Dim renderer = New ChromePdfRenderer()
		Dim pdf = renderer.RenderHtmlAsPdf("<h1>Confidential PDF</h1><p>Access is restricted.</p>")

		' Set security settings
		pdf.SecuritySettings.UserPassword = password
		pdf.SecuritySettings.AllowUserAnnotations = False
		pdf.SecuritySettings.AllowUserCopyPasteContent = False
		pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint

		Dim filePath As String = "EncryptedSecurePdf.pdf"
		pdf.SaveAs(filePath)

		Console.WriteLine($"Encrypted PDF saved to {filePath} with password: {password}")
	End Sub
End Class
$vbLabelText   $csharpLabel

Este método usa la implementación por defecto del RNG del sistema operativo, produciendo una contraseña adecuada para operaciones criptográficas.

Esto aplicará la contraseña segura generada, por lo que solo los usuarios con acceso a las contraseñas podrán ver el documento.

Ventana emergente de protección por contraseña

Adicionalmente, nos quedaremos con un documento cifrado y seguro con nuestros permisos establecidos:

Configuración de PDF cifrado

Mejores prácticas y consejos

  • Siempre usa RandomNumberGenerator para cualquier cosa relacionada con la seguridad. Evita Random para IDs, tokens o contraseñas.

  • Mantén los datos sensibles fuera de registros o mensajes expuestos a los usuarios, pero registra lo suficiente para rastrear y auditar.

  • Considera usar marcas de tiempo y otros metadatos junto a IDs aleatorios para una mejor trazabilidad.

  • Usa las funciones de seguridad integradas de IronPDF combinadas con claves aleatorias para proteger tus documentos.

  • Valida la longitud y codificación de los datos aleatorios para asegurar su usabilidad en tu contexto (por ejemplo, nombres de archivo, URLs, códigos de barras).

Resumen

Integrar la clase RandomNumberGenerator de C# con IronPDF te permite generar PDFs seguros y únicos que cumplen con los estándares modernos de seguridad. Ya sea que estés estampando IDs únicos, generando claves de cifrado, o incrustando tokens seguros, este enfoque te ayudará a:

  • Prevenir falsificación de documentos

  • Mejorar la trazabilidad

  • Proteger datos sensibles dentro de tus PDFs

Al combinar la resistencia criptográfica de esta clase con las herramientas versátiles de PDF de IronPDF, tus soluciones de PDF se vuelven más seguras y profesionales.

¡Pruébelo usted mismo!

¿Listo para mejorar la seguridad de tus PDFs? Prueba la versión gratuita de IronPDF y comienza a experimentar con datos aleatorios seguros hoy mismo.

Preguntas Frecuentes

¿Qué es la clase RandomNumberGenerator en C#?

La clase RandomNumberGenerator en C# es parte del espacio de nombres System.Security.Cryptography que proporciona métodos para generar números aleatorios criptográficamente seguros. Es particularmente útil en escenarios como la encriptación de PDF y la generación de identificadores únicos.

¿Cómo se puede usar RandomNumberGenerator en proyectos PDF?

En proyectos PDF, RandomNumberGenerator se puede usar para crear contraseñas seguras para la encriptación de PDF, generar nombres de archivo únicos y eliminar secuencias predecibles, mejorando la seguridad y unicidad de sus documentos.

¿Por qué elegir RandomNumberGenerator para generar números aleatorios?

RandomNumberGenerator se prefiere para generar números aleatorios porque produce números criptográficamente seguros, haciéndolo adecuado para aplicaciones sensitivas a la seguridad como la encriptación en documentos PDF.

¿Puede RandomNumberGenerator ayudar a evitar secuencias predecibles?

Sí, RandomNumberGenerator ayuda a evitar secuencias predecibles generando números que son criptográficamente seguros, asegurando que las secuencias sean aleatorias y no fácilmente predecibles.

¿Es conveniente RandomNumberGenerator para generar cadenas aleatorias?

Sí, RandomNumberGenerator se puede usar para generar cadenas aleatorias generando primero bytes aleatorios, los cuales pueden luego convertirse en cadenas. Esto es útil para crear contraseñas seguras o identificadores únicos en proyectos PDF.

¿Cuáles son algunos casos de uso de RandomNumberGenerator en C#?

Los casos de uso para RandomNumberGenerator en C# incluyen la encriptación de PDF, generación de nombres de archivo únicos, creación de contraseñas aleatorias y cualquier escenario que requiera números aleatorios criptográficamente seguros.

¿Cómo RandomNumberGenerator mejora la seguridad de los documentos PDF?

RandomNumberGenerator mejora la seguridad de los documentos PDF proporcionando números aleatorios criptográficamente seguros, que pueden usarse para claves de encriptación, contraseñas y otras medidas de seguridad para proteger el contenido del documento.

¿Cuál es la ventaja de usar RandomNumberGenerator sobre otros generadores de números aleatorios?

La ventaja de usar RandomNumberGenerator sobre otros generadores de números aleatorios es su capacidad para producir números criptográficamente seguros, haciéndolo adecuado para aplicaciones que requieren un alto nivel de seguridad, como la encriptación de archivos PDF.

Jacob Mellor, Director de Tecnología @ Team Iron
Director de Tecnología

Jacob Mellor es Director de Tecnología en Iron Software y un ingeniero visionario que lidera la tecnología PDF en C#. Como el desarrollador original detrás de la base de código central de Iron Software, ha moldeado la arquitectura de productos de la compañía desde ...

Leer más