質問: [key stringByAppendingString:[seed substringWithRange:NSMakeRange((int)arc4random_uniform((int)seed.length),1)]]; } return key; ``` この方法で暗号化キー生成/管理する場合、セキュリティ上の問題等は発生するのでしょうか? 問題がある場合、生成/管理それぞれどのような方式に変更したらよいか教えて頂けると幸いです。
回答: Objective-Cはよくわからないのですが、`seed`に含まれる文字をランダムに取り出し32文字連結、と言うことで良いでしょうか。 AESが要求するのは鍵長256bitの場合「32文字の文字列」ではなく「256bitの値」です。特定文字に限定すると鍵のbit数が小さくなってしまいます。(ASCII表示可能文字32文字だと210bit) 共通鍵暗号の鍵を乱数から導出する場合は、暗号論的に安全な乱数生成器(CSPRNG)を使用すべきです。 arc4random*がCSPRNGとして使えるかどうかは定か出ないのですが、`SecRandomCopyBytes`はCSPRNGだと明記されており、必要な長さのバイト列が取り出せるのでこちらを使った方が良いように思います。 多少鍵空間が小さくなるのは目をつぶると言うことであれば、1度SHA-256を通してから使うとよいでしょう。ASCII文字列だと0から数えて8の倍数bit目が必ず0になるので、規則性が出てしまいます。ハッシュ関数を通すことでそれを回避できます。