RandomNumberGenerator C#
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 artykule 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 losowe wartości o wysokim poziomie bezpieczeństwa kryptograficznego w postaci losowych bajtów, co jest znacznie bezpieczniejsze 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ę przy tej samej wartości początkowej, ta klasa została zaprojektowana z myślą o prawdziwej losowości i zastosowaniach kryptograficznych.
Dlaczego warto używać RandomNumberGenerator zamiast klasy Random w języku 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 języku 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);
}
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
Ta 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("-", "");
}
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
Wynikiem tego jest losowy ciąg znaków szesnastkowych o długości 24 znaków (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:
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}");
}
}
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
Wynik

Zaawansowany przypadek użycia: bezpieczne szyfrowanie plików PDF za pomocą losowych kluczy
IronPDF obsługuje szyfrowanie plików PDF, zapewniając solidne wsparcie dla bezpiecznego tworzenia plików 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}");
}
}
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
Metoda ta wykorzystuje domyślną implementację generatora liczb losowych (RNG) systemu operacyjnego, tworzą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 otrzymamy 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 generujesz unikalne identyfikatory, klucze szyfrujące, czy osadzasz bezpieczne tokeny, to podejście pomoże 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!
Często Zadawane Pytania
Czym jest klasa RandomNumberGenerator w języku C#?
Klasa RandomNumberGenerator w języku C# jest częścią przestrzeni nazw System.Security.Cryptography, która udostępnia metody generowania losowych liczb bezpiecznych kryptograficznie. Jest to szczególnie przydatne w takich scenariuszach, jak szyfrowanie plików PDF i generowanie unikalnych identyfikatorów.
Jak można wykorzystać RandomNumberGenerator w projektach PDF?
W projektach PDF generator liczb losowych (RandomNumberGenerator) może służyć do tworzenia bezpiecznych haseł do szyfrowania plików PDF, generowania unikalnych nazw plików oraz eliminowania przewidywalnych sekwencji, co zwiększa bezpieczeństwo i unikalność dokumentów.
Dłączego warto wybrać RandomNumberGenerator do generowania liczb losowych?
RandomNumberGenerator jest preferowany do generowania liczb losowych, ponieważ tworzy liczby bezpieczne kryptograficznie, dzięki czemu nadaje się do zastosowań wymagających bezpieczeństwa, takich jak szyfrowanie w dokumentach PDF.
Czy RandomNumberGenerator może pomóc w uniknięciu przewidywalnych sekwencji?
Tak, RandomNumberGenerator pomaga uniknąć przewidywalnych sekwencji poprzez generowanie liczb, które są bezpieczne kryptograficznie, zapewniając, że sekwencje są losowe i trudne do przewidzenia.
Czy RandomNumberGenerator nadaje się do generowania losowych ciągów znaków?
Tak, RandomNumberGenerator może służyć do generowania losowych ciągów znaków poprzez najpierw wygenerowanie losowych bajtów, które następnie można przekształcić w ciągi znaków. Jest to przydatne do tworzenia bezpiecznych haseł lub unikalnych identyfikatorów w projektach PDF.
Jakie są przykłady zastosowań generatora liczb losowych (RandomNumberGenerator) w języku C#?
Przykłady zastosowań RandomNumberGenerator w języku C# obejmują szyfrowanie plików PDF, generowanie unikalnych nazw plików, tworzenie losowych haseł oraz wszelkie scenariusze wymagające losowych liczb zabezpieczonych kryptograficznie.
W jaki sposób RandomNumberGenerator zwiększa bezpieczeństwo dokumentów PDF?
RandomNumberGenerator zwiększa bezpieczeństwo dokumentów PDF, dostarczając kryptograficznie bezpieczne liczby losowe, które mogą być wykorzystywane jako klucze szyfrujące, hasła i inne środki bezpieczeństwa służące do ochrony treści dokumentu.
Jaka jest zaleta korzystania z RandomNumberGenerator w porównaniu z innymi generatorami liczb losowych?
Zaletą korzystania z RandomNumberGenerator w porównaniu z innymi generatorami liczb losowych jest jego zdolność do generowania liczb bezpiecznych kryptograficznie, co sprawia, że nadaje się on do zastosowań wymagających wysokiego poziomu bezpieczeństwa, takich jak szyfrowanie plików PDF.




