Ir para o conteúdo do rodapé
AJUDA DO .NET

Gerador de Números Aleatórios em C#

Às vezes, ao trabalhar com documentos PDF, você pode precisar gerar números aleatórios ou sequências aleatórias. Seja para gerar números aleatórios e senhas para criptografia de PDFs, criar nomes de arquivos exclusivos, evitar sequências previsíveis ou gerar números por qualquer outro motivo, a classe RandomNumberGenerator do C# pode levar seus projetos de geração e edição de PDFs para o próximo nível.

Diferentemente de um objeto aleatório básico criado a partir da classe Random, este gerador de números aleatórios criptográficos produz valores aleatórios criptograficamente fortes, adequados para operações criptográficas em aplicações seguras.

Neste artigo, vamos explorar:

  • O que é um gerador de números aleatórios e por que ele é importante.

  • Como usar um gerador de números aleatórios criptográficos em C# para gerar números aleatórios, strings aleatórias e outros dados aleatórios para fins criptográficos.

  • Exemplos práticos de integração do RandomNumberGenerator com o IronPDF para criar PDFs seguros e exclusivos usando os números e strings gerados.

Dicas e boas práticas para aumentar a segurança e o profissionalismo em seus aplicativos PDF.

O que é a classe RandomNumberGenerator?

Antes de mergulharmos na integração com o IronPDF , vamos relembrar brevemente o que torna o RandomNumberGenerator especial.

  • Faz parte do namespace System.Security.Cryptography.

  • Gera valores aleatórios criptograficamente fortes como bytes aleatórios, muito mais seguros do que a classe Random típica.

  • É ideal para cenários que exigem imprevisibilidade, como a geração de tokens seguros, chaves, salts e identificadores únicos.

  • Utiliza algoritmos criptográficos como AES-CTR DRBG, Fortuna ou CSPRNGs fornecidos pelo sistema operacional. Tornando-o resistente à previsão.

  • Ideal para tarefas como criação de chaves criptográficas, geração de senhas, tokens de segurança e IDs de documentos exclusivos.

Essa robustez advém da utilização dos geradores de números aleatórios seguros subjacentes ao sistema operacional, o que o torna resistente a ataques de previsão ou engenharia reversa. Ao contrário dos geradores de números pseudoaleatórios, que podem produzir a mesma sequência com o mesmo valor inicial, esta classe foi projetada para gerar aleatoriedade verdadeira e para fins criptográficos.

Por que usar RandomNumberGenerator em vez da classe Random do C#?

Muitos desenvolvedores começam usando a classe Random do C# para gerar números inteiros aleatórios, mas ela não foi projetada para cenários de alta segurança. É possível prever padrões em sua saída, especialmente se o mesmo valor inicial ou horário do sistema for usado, o que significa que os números gerados podem ser adivinhados. Isso ocorre porque o método gera valores usando operações aritméticas modulares simples que podem se repetir com a mesma entrada.

Em contraste, o RandomNumberGenerator produz números verdadeiramente aleatórios, derivados de geradores de números aleatórios criptográficos no .NET Framework ou no sistema operacional subjacente. Isso garante que não haja viés para valores baixos e geralmente utiliza uma estratégia de descarte e nova tentativa para manter uma distribuição uniforme entre um limite inferior (por exemplo, int minValue) e um limite superior exclusivo (por exemplo, int maxValue). A ilustração abaixo destaca a diferença entre um gerador de números aleatórios (RNG) fraco e um seguro.

Weak vs. Secure RNG

Por que usar o RandomNumberGenerator com o IronPDF?

IronPDF é uma biblioteca .NET robusta para PDF, que permite aos desenvolvedores criar, editar e proteger documentos PDF. Casos de uso comuns em que a aleatoriedade é importante incluem:

  • Identificadores únicos de documentos: Anexe IDs criptograficamente seguros a PDFs para rastreamento ou validação.

  • Marcas d'água seguras: Incorpore marcas d'água ou códigos aleatórios que impeçam a falsificação.

  • Chaves ou senhas de criptografia: Gere chaves ou senhas seguras para criptografia de PDF.

  • Conteúdo aleatório: Adicione tokens ou salts únicos aleatórios a documentos PDF para verificação de integridade.

Como gerar dados aleatórios seguros em C

Aqui está um exemplo simples de como gerar um token aleatório 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 cria uma matriz de bytes segura e a retorna como uma string Base64 — perfeita para incorporar ou rastrear em testes unitários, nomes de arquivos ou IDs seguros.

Exemplo prático: Adicionando IDs de documento exclusivos a documentos PDF

Vamos combinar o poder do RandomNumberGenerator e do IronPDF para gerar um PDF com um ID de documento único e seguro impresso em cada página.

Etapa 1: Gere um 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

Isso gera uma sequência aleatória hexadecimal de 24 caracteres (por exemplo, "4F3A2C9B7D1E8F0A5B6C7D8E").

Passo 2: Crie o PDF e carimbe o documento de identificação.

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
  • Gera um número aleatório para um ID de documento único e criptograficamente seguro.

  • Gera um arquivo HTML para PDF incorporando esse ID.

  • Adiciona um rodapé em cada página com o ID do documento e o carimbo de data/hora.

  • Salva o PDF usando o ID no nome do arquivo para facilitar o rastreamento.

Exemplo de código totalmente funcional

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

Saída

PDF com ID do documento

Caso de uso avançado: Criptografia segura de PDF com chaves aleatórias

O IronPDF oferece suporte à criptografia de PDF , proporcionando forte proteção para a criação segura de PDFs. Você pode usar o RandomNumberGenerator para criar senhas fortes ou chaves de criptografia:

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 utiliza a implementação padrão do gerador de números aleatórios (RNG) do sistema operacional, produzindo uma senha adequada para operações criptográficas.

Isso aplicará a senha de segurança gerada, de modo que somente os usuários com acesso às senhas poderão visualizar o documento.

Pop-up de proteção por senha

Além disso, ficaremos com um documento criptografado e seguro com as permissões que definimos:

Configurações de PDF criptografado

Melhores práticas e dicas

  • Sempre utilize RandomNumberGenerator para qualquer assunto relacionado à segurança. Evite usar o método aleatório para IDs, tokens ou senhas.

  • Mantenha dados sensíveis fora dos registros ou mensagens voltadas para o usuário, mas registre o suficiente para rastreamento e auditoria.

  • Considere usar registros de data e hora e outros metadados juntamente com IDs aleatórios para melhor rastreabilidade.

  • Utilize os recursos de segurança integrados do IronPDF, combinados com chaves aleatórias, para proteger seus documentos.

  • Valide o comprimento e a codificação dos dados aleatórios para garantir a usabilidade no seu contexto (por exemplo, nomes de arquivos, URLs, códigos de barras).

Resumo

A integração da classe RandomNumberGenerator do C# com o IronPDF permite gerar PDFs seguros e exclusivos que atendem aos padrões de segurança modernos. Seja para imprimir IDs exclusivos, gerar chaves de criptografia ou incorporar tokens seguros, essa abordagem ajuda você a:

  • Prevenir a falsificação de documentos

  • Melhorar a rastreabilidade

  • Proteja dados confidenciais em seus PDFs

Ao combinar a robustez criptográfica desta classe com as ferramentas versáteis de PDF do IronPDF, suas soluções em PDF tornam-se mais seguras e profissionais.

Experimente você mesmo!

Pronto para reforçar a segurança dos seus PDFs? Experimente a versão de avaliação gratuita do IronPDF e comece a testar com dados aleatórios seguros hoje mesmo!

Perguntas frequentes

O que é a classe RandomNumberGenerator em C#?

A classe RandomNumberGenerator em C# faz parte do namespace System.Security.Cryptography e fornece métodos para gerar números aleatórios criptograficamente seguros. Ela é particularmente útil em cenários como criptografia de PDF e geração de identificadores únicos.

Como o RandomNumberGenerator pode ser usado em projetos PDF?

Em projetos em PDF, o RandomNumberGenerator pode ser usado para criar senhas seguras para criptografia de PDF, gerar nomes de arquivos exclusivos e eliminar sequências previsíveis, aumentando a segurança e a exclusividade de seus documentos.

Por que escolher o RandomNumberGenerator para gerar números aleatórios?

O RandomNumberGenerator é preferido para gerar números aleatórios porque produz números criptograficamente seguros, tornando-o adequado para aplicações que exigem alta segurança, como criptografia em documentos PDF.

O gerador de números aleatórios pode ajudar a evitar sequências previsíveis?

Sim, o RandomNumberGenerator ajuda a evitar sequências previsíveis, gerando números criptograficamente seguros, garantindo que as sequências sejam aleatórias e não facilmente previsíveis.

O RandomNumberGenerator é adequado para gerar sequências aleatórias?

Sim, o RandomNumberGenerator pode ser usado para gerar strings aleatórias, primeiro gerando bytes aleatórios, que podem então ser convertidos em strings. Isso é útil para criar senhas seguras ou identificadores únicos em projetos PDF.

Quais são alguns casos de uso para RandomNumberGenerator em C#?

Os casos de uso para RandomNumberGenerator em C# incluem criptografia de PDF, geração de nomes de arquivos exclusivos, criação de senhas aleatórias e qualquer cenário que exija números aleatórios criptograficamente seguros.

Como o RandomNumberGenerator aprimora a segurança de documentos PDF?

O RandomNumberGenerator aumenta a segurança de documentos PDF, fornecendo números aleatórios criptograficamente seguros, que podem ser usados para chaves de criptografia, senhas e outras medidas de segurança para proteger o conteúdo do documento.

Qual a vantagem de usar o RandomNumberGenerator em vez de outros geradores de números aleatórios?

A vantagem de usar o RandomNumberGenerator em relação a outros geradores de números aleatórios é sua capacidade de produzir números criptograficamente seguros, tornando-o adequado para aplicações que exigem um alto nível de segurança, como a criptografia de arquivos PDF.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim