Điểm:2

Có an toàn không khi tạo nonce bằng cách sử dụng trình tạo số ngẫu nhiên và thuật toán băm bằng khóa bí mật như HMAC?

lá cờ ag

Tôi đang xây dựng một dự án trên bộ vi điều khiển Arduino Mega và tôi cần một số trình tạo nonce để trao đổi phản hồi thử thách. Nhưng tôi không tìm thấy một số trình tạo chuỗi chữ và số. Sau đó, tôi nảy ra một ý tưởng để làm một cái bằng cách sử dụng ngẫu nhiên() chức năng tạo int ngẫu nhiên trong giới hạn bạn cung cấp và băm số nguyên đó bằng HMAC bằng cách sử dụng một khóa bí mật khác (một khóa có thể được tạo tự động khi khởi động vì nó không cần phải nhất quán).

Cách tiếp cận này có làm cho nonce của tôi kém an toàn hơn theo một cách nào đó không?

kelalaka avatar
lá cờ in
Sử dụng cái này hơn SHA256? https://www.codeproject.com/Articles/5311070/A-True-Random-Number-Generator-in-Arduino-AVR-ATme
krystof18 avatar
lá cờ ag
Tôi không chắc là tôi hiểu bạn đang nói gì. Thay vào đó, tôi có nên sử dụng SHA256 để băm giá trị ngẫu nhiên không? Tôi sử dụng HMAC vì tôi sẽ sử dụng thư viện đó rồi và tôi cần làm cho chương trình nhỏ nhất có thể.
kelalaka avatar
lá cờ in
HMAC phải được sử dụng với hàm băm có sẵn cho bạn hoặc sử dụng HMAC theo ý muốn vì nó được thiết kế để trở thành PRF.
krystof18 avatar
lá cờ ag
Bạn nói đúng, tôi có sẵn SHA256 trong cùng thư viện đó. Ưu điểm của việc sử dụng SHA256 so với HMAC là gì? Tôi đoán nó sẽ nhanh hơn khi tính nonce phải không?
kelalaka avatar
lá cờ in
Đối với bạn, HMAC đã tính toán SHA-256 kép và bạn không cần hàm băm có khóa (đôi khi được gọi là Keyed MAC, nhưng thực ra HMAC là một kỹ thuật để xây dựng các họ hàm giả ngẫu nhiên (PRF)). SHA-256 là đủ cho nonce.
Manish Adhikari avatar
lá cờ us
Trong thiết kế của bạn, phần quan trọng xác định tính bảo mật của bạn sẽ là trình tạo số ngẫu nhiên. Nó phải là một trình tạo số ngẫu nhiên an toàn cho cả việc tạo khóa. Int được sử dụng tiếp theo có thể dự đoán được nhưng nó không được lặp lại để ngăn chặn các cuộc tấn công phát lại.
Điểm:2
lá cờ cn

ngẫu nhiên() là rác rưởi. Xem một số nguồn đây.

Cách tốt nhất để tạo nonce là thông qua một trình tạo số ngẫu nhiên thực sự, trừ khi bạn muốn >10.000 nonce mỗi giây, điều này khó xảy ra trong tình huống vi điều khiển. Bạn có thể làm điều đó mà không cần bất kỳ phần cứng bổ sung nào bằng cách sử dụng Thư viện Entropy Arduino. Thư viện sử dụng jitter tự nhiên giữa đồng hồ của AVR và bộ đếm thời gian giám sát. Đây là một lĩnh vực được nghiên cứu kỹ về thiết kế TRNG thường được sử dụng trong các bộ tạo dao động vòng. Hoặc cuộn biến thể của riêng bạn (không khó lắm nếu bạn xem lại mã gốc).

Nó không nhanh lắm, (64 bit/s) nhưng nó sẽ cung cấp cho bạn một nonce 96 bit thực sự ngẫu nhiên trong vòng chưa đầy hai giây. Bằng cách đó, bạn không cần theo dõi các nonce đã sử dụng. Và đó là bằng chứng khởi động lại.

Maarten Bodewes avatar
lá cờ in
Khi bạn có 96 bit thì bạn có thể sử dụng nó để tạo CSPRNG, thường sẽ nhanh hơn nhiều. Paul có thể sẽ phản đối rằng TRNG an toàn hơn, nhưng vì các mục đích thực tế, tôi nghĩ rằng CSPRNG được gieo mầm tốt nói chung là con đường phía trước.
Paul Uszak avatar
lá cờ cn
Paul sez rằng mật mã dòng liên tục không phải là nonce. Đó là câu hỏi.
Maarten Bodewes avatar
lá cờ in
Tuy nhiên, không ai yêu cầu một *single* nonce, vì vậy mặc dù có thể xảy ra trường hợp đó, nhưng tôi đoán trường hợp sử dụng là tạo nhiều nonce và điều đó yêu cầu RNG nếu bạn muốn chúng được chọn ngẫu nhiên.
Điểm:2
lá cờ fr

Cách tiếp cận bạn sử dụng phụ thuộc vào yêu cầu của nonce. Trong trường hợp bạn mô tả, một giao thức phản hồi thử thách, các yêu cầu của nonce thường là giao thức đó là duy nhất và không bao giờ được sử dụng lại. Tuy nhiên, có những tình huống khác mà nonce cũng cần phải không thể đoán trước, chẳng hạn như nếu bạn đang sử dụng chế độ CBC để mã hóa.

Bạn có thể sử dụng HMAC với cái này và để sử dụng hàm băm với nó, tôi khuyên dùng SHA-256. Tuy nhiên, tôi không khuyên bạn nên tạo giá trị cho HMAC bằng cách sử dụng ngẫu nhiên bởi vì điều đó có thể lặp lại và sau đó nonce của bạn cũng vậy. Nói chung, bạn không thể dựa vào chất lượng của PRNG trong tiêu chuẩn C và POSIX. Thay vào đó, bạn có thể sử dụng bộ đếm tăng đơn điệu, điều này sẽ đảm bảo rằng nó không bao giờ lặp lại, nhưng bạn sẽ phải có một số cách để duy trì bộ đếm giữa các lần sử dụng.

krystof18 avatar
lá cờ ag
Vấn đề với bộ đếm là có khả năng bộ vi điều khiển sẽ mất nguồn và bộ đếm sẽ được thiết lập lại.Nhưng tôi có thể sử dụng RTC bên ngoài với pin riêng biệt, điều đó sẽ đảm bảo ít nhất là không lặp lại trong vài năm. Đó có phải là ý tưởng tồi?
Maarten Bodewes avatar
lá cờ in
Ngoài ra còn có EEPROM đi kèm, là bộ nhớ liên tục. Vấn đề với điều đó là nó sẽ có số lượng ghi hạn chế. Tuy nhiên, có thể viết một bộ đếm tuần tự cho mỗi lần khởi động và sau đó có một bộ đếm riêng trong bộ nhớ. Chỉ cần suy nghĩ to ở đây.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.