Encryption
在消息中交換加密鹽和初始化向量是否安全?
我有一個執行以下操作的客戶:
salt = randomBytes(16) iv = randomBytes(16) // secret is a user-specified passphrase key = pbkdf2(secret, salt) message[0] = salt.toHex() + iv.toHex() message[1..n] = encrypt('message content', key, iv) // to notify server that message stream is ended message[n+1] = end_message
我想知道這樣發送
salt
和發送iv
到伺服器是否安全?伺服器會:
if(count == 0) { salt = message[count][0..15].toBytes() iv = message[count][16..31].toBytes() count++ return } if(message[count] === end_message) { log(output) count = 0 output = '' return } // for every subsequent message until end_message key = pbkdf2(secret, salt) output += decrypt(message[count++], key, iv)
AES-256-CTR
是使用的加密。
答案是肯定的。以明文形式發送 IV 沒有問題。所以,這很好。同樣,鹽也不會增加熵,所以這也很好。
話雖如此,我從程式碼中了解到該應用程序沒有使用均勻分佈(並且熵如此之高)的密鑰。這是一個問題而且非常糟糕,因為很容易對密碼空間進行暴力搜尋。在實踐中,這是非常有效的。
鹽有點幫助,因為它使準備時間/空間權衡攻擊(通常稱為彩虹表攻擊,因為這是攻擊的一個實例)成為不可能。但是,除非使用非常高的熵密鑰,否則它仍然不安全。
另一件非常奇怪的事情(而且有點超出範圍,所以無論如何我都會參考它)是伺服器正在為每個塊重新生成密鑰。這確實是低效的(每次執行 AES 的密鑰派生成本和密鑰計劃)。