
Usprawnij e-fakturowanie dzięki najnowszej aktualizacji IronPDF: zgodność z PDF/A-3 i obsługa ZUGFeRD
Czasami podczas pracy z dokumentami PDF może zaistnieć potrzeba wygenerowania liczb losowych lub losowych ciągów znaków. Niezależnie od tego, czy generujesz losowe liczby i hasła do szyfrowania plików PDF, tworzysz unikalne nazwy plików, unikasz przewidywalnych sekwencji, czy też potrzebujesz generować liczby z jakiegokolwiek innego powodu, użycie klasy RandomNumberGenerator w języku C# może pomóc przenieść Twoje projekty związane z generowaniem i edycją plików PDF na wyższy poziom.
W przeciwieństwie do podstawowego obiektu losowego utworzonego z klasy Random, ten kryptograficzny generator liczb losowych generuje wartości losowe o wysokim poziomie bezpieczeństwa kryptograficznego, odpowiednie do operacji kryptograficznych w bezpiecznych aplikacjach.
W tym artykułe omówimy:
-
Czym jest RandomNumberGenerator i dlaczego ma znaczenie.
-
Jak używać kryptograficznego generatora liczb losowych w języku C# do generowania liczb losowych, losowych ciągów znaków i innych danych losowych do celów kryptograficznych.
-
Praktyczne przykłady integracji RandomNumberGenerator z IronPDF w celu tworzenia bezpiecznych, unikalnych plików PDF przy użyciu wygenerowanych liczb i ciągów znaków.
-
Wskazówki i najlepsze praktyki pozwalające zwiększyć bezpieczeństwo i profesjonalizm aplikacji PDF.
Czym jest klasa RandomNumberGenerator
Zanim zagłębimy się w integrację z IronPDF, przypomnijmy sobie pokrótce, co sprawia, że RandomNumberGenerator jest wyjątkowy.
-
Jest to część przestrzeni nazw System.Security.Cryptography.
-
Generuje kryptograficznie silne wartości losowe jako losowe bajty, znacznie bardziej bezpieczne niż typowa klasa Random.
-
Jest to idealne rozwiązanie w sytuacjach wymagających nieprzewidywalności, takich jak generowanie bezpiecznych tokenów, kluczy, saltów i unikalnych identyfikatorów.
-
Wykorzystuje algorytmy kryptograficzne, takie jak AES-CTR DRBG, Fortuna lub generatory liczb losowych CSPRNG dostarczane przez system operacyjny. Uodpornienie go na przewidywania.
-
Najlepiej sprawdza się w zadaniach takich jak tworzenie kluczy kryptograficznych, generowanie haseł, bezpieczne tokeny, unikalne identyfikatory dokumentów.
Ta zaleta wynika z wykorzystania bezpiecznych generatorów liczb losowych wbudowanych w system operacyjny, co sprawia, że jest on odporny na ataki polegające na przewidywaniu lub inżynierii odwrotnej. W przeciwieństwie do generatorów liczb pseudolosowych, które mogą generować tę samą sekwencję z tą samą wartością ziarna, ta klasa jest zaprojektowana do prawdziwej losowości i celów kryptograficznych.
Dlaczego używać RandomNumberGenerator zamiast klasy Random w C#?
Wielu programistów zaczyna od klasy Random w języku C# do generowania losowych liczb całkowitych, ale nie jest ona przeznaczona do scenariuszy wymagających wysokiego poziomu bezpieczeństwa. Wyniki mogą być przewidywalne, zwłaszcza jeśli używana jest ta sama wartość początkowa lub czas systemowy, co oznacza, że wygenerowane liczby można odgadnąć. Dzieje się tak, ponieważ metoda generuje wartości przy użyciu prostych operacji arytmetyki modułowej, które mogą się powtarzać przy tych samych danych wejściowych.
Natomiast RandomNumberGenerator generuje prawdziwie losowe liczby, pochodzące z kryptograficznych generatorów liczb losowych w .NET Framework lub w systemie operacyjnym. Zapewnia to brak stronniczości wynikającej z niskiej wartości i często wykorzystuje strategię odrzucania i ponownej próby w celu utrzymania jednolitego rozkładu między dolną granicą (np. int minValue) a wyłączną górną granicą (np. int maxValue). Poniższa ilustracja pokazuje różnicę między słabym generatorem liczb losowych (RNG) a bezpiecznym.

Dlaczego warto używać RandomNumberGenerator z IronPDF
IronPDF to solidna biblioteka .NET do obsługi plików PDF, umożliwiająca programistom tworzenie, edycję i zabezpieczanie dokumentów PDF. Typowe przypadki użycia, w których losowość ma znaczenie, obejmują:
-
Unikalne identyfikatory dokumentów: Dołączaj do plików PDF kryptograficznie zabezpieczone identyfikatory w celu śledzenia lub weryfikacji.
-
Zabezpieczone znaki wodne: Osadzaj losowe znaki wodne lub kody, które zapobiegają fałszerstwom.
-
Klucze szyfrujące lub hasła: Generuj bezpieczne klucze lub hasła do szyfrowania plików PDF.
-
Random Content: Dodaj losowe unikalne tokeny lub sole do dokumentów PDF w celu weryfikacji integralności.
Jak generować bezpieczne dane losowe w C#
Oto prosty przykład generowania bezpiecznego losowego tokenu 128-bitowego (16-bajtowego).
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 FunctionTa metoda tworzy bezpieczną tablicę bajtów i zwraca ją jako ciąg znaków Base64 — idealny do osadzania lub śledzenia w testach jednostkowych, nazwach plików lub bezpiecznych identyfikatorach.
Praktyczny przykład: Dodawanie unikalnych identyfikatorów dokumentów do plików PDF
Połączmy możliwości RandomNumberGenerator i IronPDF, aby wygenerować plik PDF z unikalnym, bezpiecznym identyfikatorem dokumentu umieszczonym na każdej stronie.
Krok 1: Wygeneruj bezpieczny identyfikator dokumentu
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 FunctionTo generuje 24-znakowy losowy ciąg hex (np. "4F3A2C9B7D1E8F0A5B6C7D8E").
Krok 2: Utwórz plik PDF i umieść na nim identyfikator
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:-
Generuje losową liczbę, która służy jako unikalny identyfikator dokumentu, zabezpieczony kryptograficznie.
-
Renderuje osadzenie HTML do PDF, które identyfikuje ten identyfikator.
-
Dodaje stopkę na każdej stronie z identyfikatorem dokumentu i sygnaturą czasową.
-
Zapisuje plik PDF, wykorzystując identyfikator w nazwie pliku, co ułatwia śledzenie.
Przykład pełnego działającego kodu
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 ClassWynik

Zaawansowany przypadek użycia: bezpieczne szyfrowanie plików PDF za pomocą losowych kluczy
IronPDF wspiera szyfrowanie PDF, zapewniając silne wsparcie do tworzenia bezpiecznych PDF. Możesz użyć RandomNumberGenerator do tworzenia silnych haseł lub kluczy do szyfrowania:
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 ClassTa metoda używa domyślnej implementacji z RNG systemu operacyjnego, generując hasło odpowiednie do operacji kryptograficznych.
Spowoduje to zastosowanie wygenerowanego bezpiecznego hasła, dzięki czemu tylko użytkownicy posiadający dostęp do haseł będą mogli wyświetlić dokument.

Dodatkowo, będziemy mieli zaszyfrowany, bezpieczny dokument z naszymi ustawionymi uprawnieniami:

Najlepsze praktyki i wskazówki
-
Zawsze używaj RandomNumberGenerator do wszystkiego, co dotyczy bezpieczeństwa. Należy unikać losowych wartości dla identyfikatorów, tokenów lub haseł.
-
Nie umieszczaj danych wrażliwych w logach ani komunikatach wyświetlanych użytkownikom, ale rejestruj wystarczającą ilość informacji, aby umożliwić śledzenie i audyt.
-
Aby zapewnić lepszą identyfikowalność, warto rozważyć użycie znaczników czasu i innych metadanych wraz z losowymi identyfikatorami.
-
Wykorzystaj wbudowane funkcje zabezpieczeń IronPDF w połączeniu z losowymi kluczami, aby chronić swoje dokumenty.
-
Sprawdź długość losowych danych i ich kodowanie, aby zapewnić ich użyteczność w danym kontekście (np. nazwy plików, adresy URL, BARCODES).
Podsumowanie
Zintegrowanie klasy RandomNumberGenerator języka C# z IronPDF pozwala generować bezpieczne, unikalne pliki PDF, które spełniają współczesne standardy bezpieczeństwa. Niezależnie od tego, czy stemplujesz unikalne identyfikatory, generujesz klucze szyfrowania czy osadzasz zabezpieczone tokeny, ta metoda pomaga ci:
-
Zapobieganie fałszowaniu dokumentów
-
Poprawa identyfikowalności
-
Zabezpiecz poufne dane w plikach PDF
Dzięki połączeniu siły kryptograficznej tej klasy z wszechstronnymi narzędziami PDF firmy IronPDF Twoje rozwiązania PDF staną się bezpieczniejsze i bardziej profesjonalne.
Spróbuj sam!
Chcesz zwiększyć bezpieczeństwo swoich plików PDF? Wypróbuj bezpłatną wersję próbną IronPDF i już dziś zacznij eksperymentować z bezpiecznymi danymi losowymi!

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczącą ponad 50 osób, obsługującą NASA, Teslę i światowe agencje rządowe.
Powiązane artykuły


