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.

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
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
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:
-
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
Saída

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
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.

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

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.




