Cách nhanh chóng để ngẫu nhiên hóa HD?


14

Tôi đã đọc về cách làm cho ổ cứng an toàn để mã hóa và một trong các bước là ghi các bit ngẫu nhiên vào ổ đĩa, để làm cho dữ liệu được mã hóa không thể phân biệt được với phần còn lại của dữ liệu trên ổ cứng.

Tuy nhiên, khi tôi đã thử sử dụng dd if=/dev/urandom of=/dev/sdatrong quá khứ, ETA đã được sắp xếp theo thứ tự ngày. Tôi đã thấy một cái gì đó về việc sử dụng badblocksthay cho urandom, nhưng điều đó dường như không giúp được gì nhiều. Tôi chỉ muốn biết liệu có cách nào có thể giúp tôi tăng tốc điều này không, chẳng hạn như các tùy chọn cho ddhoặc điều gì khác mà tôi có thể thiếu, hoặc nếu tốc độ chỉ là giới hạn của HD.


Thay đổi kích thước khối của bạn thành một cái gì đó thân thiện hơn đối với các ổ đĩa cứng. dd bs=1Mví dụ.
Patrick

Tốc độ bạn đã nhận được? Phải mất một thời gian để viết toàn bộ ổ cứng 3TB (ví dụ). Ngoài ra kiểm tra iostat -kx 10để xem% bận trên ổ đĩa là gì.
derobert

5
shred -v -n 1 /dev/overwritethislà nhanh Đó là về trường hợp duy nhất shredthực sự hữu ích cho một cái gì đó.
frostschutz

@derobert: Tôi thực sự không thể nói chắc chắn là nó nhanh như thế nào, nhưng tôi đã rời đi trong vài giờ, đã quay lại và nó đã hoàn thành khoảng 10% cho HD nội bộ 500G của tôi lần đầu tiên tôi thử điều này. Cảm ơn vì mẹo "
iter

@Patrick: Tôi đã thử bs = 4M một cách mù quáng, vì tôi thấy điều đó trong hướng dẫn về cách đặt Arch CD trên usb. Nó giúp một chút, nhưng nó vẫn khá chậm.
bitflips

Câu trả lời:


14

dd if=/dev/urandom of=/dev/sda, hoặc đơn giản cat /dev/urandom >/dev/sda , không phải là cách nhanh nhất để lấp đầy đĩa với dữ liệu ngẫu nhiên. Linux /dev/urandomkhông phải là RNG mật mã nhanh nhất xung quanh. Có một sự thay thế cho / dev / urandom không? có một số gợi ý. Cụ thể, OpenSSL chứa PRNG mật mã nhanh hơn:

openssl rand $(</proc/partitions awk '$4=="sda" {print $3*1024}') >/dev/sda

Lưu ý rằng cuối cùng, việc có cải thiện hay không phụ thuộc vào phần nào là nút cổ chai: CPU hoặc đĩa.

Tin tốt là việc lấp đầy đĩa với dữ liệu ngẫu nhiên hầu như vô dụng. Đầu tiên, để xua tan một huyền thoại phổ biến, việc xóa sạch các số 0 cũng tốt như trên phần cứng ngày nay . Với công nghệ đĩa cứng của thập niên 1980, việc ghi đè lên một đĩa cứng bằng 0 đã để lại một khoản phí nhỏ có thể được phục hồi với phần cứng đắt tiền; nhiều lượt ghi đè với dữ liệu ngẫu nhiên (xóa Gut Gutmann lau) là cần thiết. Ngày nay, ngay cả một lần ghi đè bằng số 0 cũng để lại dữ liệu không thể thực sự được phục hồi ngay cả trong điều kiện phòng thí nghiệm.

Khi bạn đang mã hóa một phân vùng, việc lấp đầy đĩa bằng dữ liệu ngẫu nhiên là không cần thiết để bảo mật dữ liệu được mã hóa. Nó chỉ hữu ích nếu bạn cần tạo không gian được sử dụng bởi dữ liệu được mã hóa không thể phân biệt với không gian không sử dụng. Xây dựng một khối lượng được mã hóa trên đỉnh của một thùng chứa không ngẫu nhiên cho thấy khối đĩa nào đã được sử dụng bởi khối lượng được mã hóa. Điều này đưa ra một gợi ý tốt về kích thước tối đa của hệ thống tập tin (mặc dù thời gian trôi qua nó sẽ trở thành một xấp xỉ tồi tệ và tồi tệ hơn), và nhiều hơn nữa.


4
Gutmann hoàn toàn là một huyền thoại, tôi không nghĩ nó thực sự đã được thực hiện cho một đĩa cứng thập niên 1980. Điều trớ trêu là với các ổ đĩa ngày càng thông minh hơn, bạn thực sự nên sử dụng dữ liệu ngẫu nhiên hiện nay để đảm bảo ổ đĩa bị buộc phải ghi, thay vì cung cấp miễn phí (cắt) hoặc nén dữ liệu. Số không chỉ tốt nếu chúng thực sự được viết.
frostschutz

1
@mellowmaroon Vâng, cat /dev/zerohầu như luôn luôn là đủ. Nó chỉ không đủ nếu bạn muốn ẩn bao nhiêu dung lượng trống trên ổ đĩa được mã hóa.
Gilles 'SO- ngừng trở nên xấu xa'

1
@mellowmaroon Nó khá vô dụng. Một kẻ nghe trộm sẽ biết rằng bạn có nhiều nhất X MB dữ liệu (và có thể ít hơn rất nhiều, bởi vì không gian trước đây được sử dụng nhưng hiện tại không thể phân biệt được với không gian đã sử dụng), vậy thì sao? Ngoài ra, vị trí của không gian trống có thể tiết lộ loại hệ thống tập tin (bản sao siêu khối); điều đó hiếm khi là một mối quan tâm (nó thường được phơi bày trong phần văn bản rõ ràng /etc/fstab, trừ khi bạn đã mã hóa phân vùng gốc, và thậm chí sau đó không có một số lượng lớn các tùy chọn hợp lý như vậy).
Gilles 'SO- ngừng trở nên xấu xa'

2
@Gilles Vấn đề tôi gặp phải trong Ubuntu 13.10 là openssl randdường như có giới hạn trên về số byte mà nó sẽ tạo ra. Nếu bạn vượt quá giới hạn đó, ví dụ 'openssl rand 810000000000 , then no random output is generated. Only a brief "help" text is printed. I'm trying to random (pretty much) fill a 3TB hard drive. Not sure if there is a way to get openssl` để tạo ra nhiều byte ngẫu nhiên đó.
phi lý John

1
Đối với vấn đề giới hạn trên của John không hợp lý, 810 tỷ byte xuất hiện khoảng 754 GB. Làm thế nào về việc phân vùng đĩa của bạn thành nhiều phân vùng 700 GB, sau đó chạy openssl randlệnh trên mỗi phân vùng ngược lại bắt đầu từ sda5 hoặc bất cứ điều gì và làm việc ngược lại với sda1 và cuối cùng là sda?
jia103

6

Các openssl dường như không làm việc cho tôi. Tôi có "tùy chọn không xác định" và các vấn đề khác với các giải pháp được cung cấp. Vì vậy, tôi đã kết thúc với chương trình fio.

fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0

Có vẻ như sẽ mất 3 giờ để làm 19TB trên 24 ổ cứng. Khoảng 1.800 MB / s

smp-016:~ # fdisk -l /dev/md0
Disk /dev/md0: 18890.1 GB, 18890060464128 bytes

smp-016:~ # fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0
fill: (g=0): rw=write, bs=512M-512M/512M-512M/512M-512M, ioengine=libaio, iodepth=4
fio-2.2.10
Starting 1 process
Jobs: 1 (f=1): [W(1)] [2.7% done] [0KB/1536MB/0KB /s] [0/3/0 iops] [eta 03h:01m:11s]

Tôi hy vọng đây thực sự là dữ liệu ngẫu nhiên. Trang man nói fio "Mặc định: điền vào bộ đệm với dữ liệu ngẫu nhiên." http://linux.die.net/man/1/fio

Tôi không làm việc đó vì mục đích bảo mật / mã hóa, chỉ cố gắng đảm bảo các bài kiểm tra đọc sau này của tôi là dữ liệu thực tế chứ không chỉ là 0. Lệnh fio tương tự này có thể được sử dụng cho điều kiện tiên quyết SSD / NVMe. Vì chỉ cần sử dụng / dev / zero có thể dẫn đến việc nén mức "đĩa" mức độ thực sự được ghi. Mặc dù tôi sẽ thêm một -loops=2lá cờ vào nó, nếu đó là một ổ SSD mới để đo điểm chuẩn.

Nếu bạn muốn nó an toàn, bạn có thể sử dụng -randrepeat=bool tùy chọn này, vì điều đó sẽ chuyển đổi "Tạo trình tạo số ngẫu nhiên theo cách có thể dự đoán được để kết quả có thể lặp lại trong các lần chạy. Mặc định: đúng.", Nhưng tôi vẫn không chắc chắn làm thế nào an toàn đó sẽ được.

Ngoài ra, một số ổ cứng loại doanh nghiệp có SED (Ổ đĩa tự mã hóa) và sẽ cho phép bạn quay khóa mã hóa để xóa ngay lập tức và an toàn tất cả dữ liệu được ghi.

Cuối cùng, trước đây tôi đã sử dụng DBAN (còn gọi là Darik's Boot và Nuke), có các tùy chọn khởi động CD và USB và "là một dự án nguồn mở được lưu trữ trên SourceForge. Chương trình được thiết kế để xóa một cách an toàn đĩa cứng cho đến khi dữ liệu của nó là vĩnh viễn loại bỏ và không còn có thể phục hồi "


1
Kích thước = 100% không hoạt động với tôi, nhưng fill_device = 1 (hoặc fill_fs = 1) đã làm.
d.jamison 7/12/2016

Tôi nghĩ rằng điều đó sẽ phụ thuộc nếu bạn cung cấp cho nó một thiết bị cấp khối hoặc hệ thống tập tin để lấp đầy. Với thiết bị cấp khối, nó biết nó lớn như thế nào và kích thước là một phần trăm kích thước của thiết bị. Khi fill_device đi đến khi nó gặp lỗi đầy đủ của thiết bị. Tôi nghĩ rằng cờ fill_device có thể không ghi đè lên bất kỳ tệp nào, chỉ là không gian chưa sử dụng. Tôi chưa thử nghiệm điều đó, vì tôi thường tránh các hệ thống tập tin trừ khi cần thiết khi tôi thực hiện kiểm tra thiết bị.
TaylorSanchez

6

Bạn có thể nhận OpenSSL để mã hóa /dev/zerobằng mật khẩu ngẫu nhiên, cung cấp dữ liệu giả ngẫu nhiên rất nhanh (nếu CPU của bạn hỗ trợ tăng tốc nó).

openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero | dd of=/dev/sda

Bạn có thể dẫn đường này qua pvđể có được tiến độ / ETA. Các lệnh tôi đang chạy ngay bây giờ (trong một vỏ gốc) là:

DISK="sda"
DISKSIZE=$(</proc/partitions awk '$4=="'"$DISK"'" {print sprintf("%.0f",$3*1024)}')
apt-get install pv
openssl enc -aes-256-ctr -nosalt \
  -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" \
  < /dev/zero |
  pv --progress --eta --rate --bytes --size "$DISKSIZE" |
  dd of=/dev/"$DISK" bs=2M

Tôi đã có ý tưởng này từ câu trả lời này , sau khi gặp vấn đề tương tự như John phi lý , người đã bình luận về câu trả lời của Gilles ở trên. Điều này đã tăng tốc độ xóa của tôi lên mảng RAID mới của tôi từ 11 MB / s lên khoảng 300 MB / s, mất những gì sẽ mất một tuần xuống còn 10 giờ.

Tôi sẽ thêm rằng bạn sẽ có thể sử dụng thay vì câu lệnh phức tạp hơn ở trên, nhưng có một lỗi chỉ cho phép tạo ra 16 MB đầu ra. (Lỗi này đã được nộp, tháng 1 năm 2016.)openssl rand #of_bytesopenssl enc ...ssl

Và, theo câu trả lời cho câu hỏi này và tiếp tục cho rằng CPU là nút cổ chai, có thể tăng tốc độ hơn nữa bằng cách chạy nhiều openssltiến trình song song trên các lõi riêng biệt, kết hợp chúng bằng cách sử dụng FIFO.


Không chắc chắn chỉnh sửa là cần thiết. Câu trả lời khác cho câu hỏi này đề nghị openssl rand.
run rẩy

2
Điểm chuẩn :: dd if=/dev/urandom18MiB / s , openssl enc: ~ 180MiB / s , fio: 169MiB / s, openssl randkhông hỗ trợ> 754GB. Lưu ý rằng nếu bạn cũng muốn tính toán kích thước tự động, hãy sử dụng : openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt </dev/zero | pv --progress --eta --rate --bytes --size $(</proc/partitions awk '$4=="sda" {print sprintf("%.0f",$3*1024)}') | dd of=/dev/sda bs=2M. Coi chừng, sdacó mặt hai lần trong lệnh này.
KrisWebDev 19/03/2016

0

Hoàn thành câu trả lời của Marco, điều bạn cần là trình tạo số ngẫu nhiên nhanh hơn.

Bạn sử dụng một chương trình đơn giản lặp lại các số ngẫu nhiên từ một thư viện tốt boost::randomvà sử dụng số đó trong đó dd.

Nếu bạn chọn boost, bạn có thể sử dụng ví dụ này , thay đổi experimentchức năng theo nhu cầu của bạn.


Giải pháp boost trên hệ thống của bạn nhanh hơn bao nhiêu? Một điểm chuẩn phi khoa học nhanh chóng trên máy của tôi mang lại tốc độ chính xác như /dev/urandom.
Marco

boost::randomkhông cung cấp RNG tiền điện tử, phải không? Nếu bạn sẽ sử dụng RNG không mã hóa, bạn cũng có thể sử dụng các số 0: ít nhất bạn sẽ không có ảo tưởng về bảo mật.
Gilles 'SO- ngừng trở thành ác quỷ'

Tôi không thể cụ thể về việc boost::randommáy phát điện nhanh hơn bao nhiêu , cách duy nhất để biết chắc chắn là đo thuật toán nhanh nhất của chúng so với/dev/urandom
RSFalcon7

0

Nút cổ chai nếu không phải kích thước khối cũng không phải ổ cứng, mà là thế hệ chậm của các số giả ngẫu nhiên. /dev/urandomlà bởi cường độ nhanh hơn so với /dev/randomvì nó không chặn trên một hồ bơi entropy thấp.

Bạn có thể xác nhận điều này bằng cách đo đầu ra thô của các số giả ngẫu nhiên:

pv /dev/urandom >/dev/null

Tốc độ này sẽ chậm hơn nhiều so với tốc độ ghi của ổ cứng của bạn. Một giải pháp chính xác hoàn toàn phụ thuộc vào mức độ bảo mật cần thiết của bạn. Nếu bạn yêu cầu bảo mật cao, hãy sử dụng trình tạo ngẫu nhiên phần cứng nhanh hoặc chấp nhận tốc độ chậm. Nếu nhu cầu bảo mật của bạn không cao, bạn có thể thu thập vài chục MiB dữ liệu và ghi chuỗi đó liên tục vào ổ đĩa. Hoặc thậm chí có thể viết số không từ /dev/zerolà một tùy chọn.

Tóm lược

/dev/random - an toàn, rất chậm
/dev/urandom- ít bảo mật¹,
RNG phần cứng chậm - an toàn, nhanh, rất tốn kém
( /dev/zero - không ngẫu nhiên chút nào, rất nhanh)

¹ Theo Là một rand từ / dev / urandom đảm bảo cho một chìa khóa đăng nhập? /dev/urandomlà an toàn như /dev/random. Cảm ơn Gilles đã chỉ ra điều này.


Anh ấy đã sử dụng urandom.
Patrick

Thật. Quan điểm của tôi là ngay cả urandom cũng quá chậm so với nhu cầu của anh ấy, đó là lý do tại sao anh ấy cần một giải pháp khác với urandom.
Marco


@Gilles Cảm ơn các liên kết. Trang hướng dẫn rõ ràng: Kết quả là, nếu không có đủ entropy trong nhóm entropy, các giá trị được trả về về mặt lý thuyết dễ bị tấn công bằng mật mã. Đó là lý do tại sao tôi phân loại nó kém an toàn hơn.
Marco

0

Tôi đã cố gắng lấp đầy ổ cứng USB ngoài 4TB với dd if=/dev/urandom of=/dev/sdX status=progresstốc độ quá chậm (không phân biệt bs=cài đặt) và dường như opensslcó giới hạn về số lượng dữ liệu ngẫu nhiên mà nó sẽ xuất ra (ít nhất là cho phiên bản 1.0.2p). Tùy chọn tốt nhất tôi tìm thấy là nhận xét từ frostschutz để sử dụng shred, như trong:

shred -v -n 1 /dev/sdX

Đảm bảo sử dụng -n 1nếu không nó sẽ mặc định ghi lại thiết bị 3 lần (cộng với việc -vhiển thị tiến trình). Tôi không nghĩ chất lượng của các số giả ngẫu nhiên là cao, nhưng nó đủ để tôi chuẩn bị một ổ cứng di động dung lượng lớn để mã hóa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.