arc4random_uniform()
のようなPRNGを使用したいと思います。しかし、Wikipedia seems to think that rc4 is insecure。私は自分自身を確認するための資金を持っていませんが、セキュリティは私のユースケースの要件です。iOS上のarc4randomの代わりに暗号的に安全な方法はありますか?
答えて
arc4random_uniform
は、「暗号擬似乱数ジェネレータ」として文書化されているため、この目的には問題ありません。 RC4のセキュリティ上の問題をarc4random
と混同しないでください。詳細はZaph's answerを参照してください。 (私は以前これを研究していましたが、arc4random
は他のアプローチと同じくらい安全ですが、私は自分の記憶を信頼する以上にザフを信頼しています)。
あなたが緊張していたら、使用はSecRandomCopyBytes
です(代替として/dev/random
から読み取ることができます。これは正確にはSecRandomCopyBytes
の仕様です)。
SecRandomCopyBytes
からランダムな値を取得するのは難しいですが、それほど難しくありません。ここでは、あなたは非常に一般的な方法(スウィフト3)でそれを行う方法は次のとおりです。
extension Integer {
static func makeRandom() -> Self {
var result: Self = 0
withUnsafeMutablePointer(to: &result) { resultPtr in
resultPtr.withMemoryRebound(to: UInt8.self, capacity: MemoryLayout<Self>.size) { bytePtr in
SecRandomCopyBytes(nil, MemoryLayout<Self>.size, bytePtr)
}
}
return result
}
}
これはどのInteger
上で動作します。基本的には、ランダムなバイトの束をInteger
と解釈します。 (このアプローチは浮動小数点値ではほとんど同じように機能しませんが、実際には可能ですが、浮動小数点ではすべてのビットパターンが実際には数値であるわけではないので、少し複雑です)
バイアスを導入せずに範囲内の値を取得したいとします。ちょうどx % limit
と言うと、modulo biasが作成されます。それをしないでください。正しい方法は、arc4random_uniform
が行うことです。それはopen sourceだから、ちょうどそれを見ることができます。 Integer
には.max
プロパティがありませんので、我々はInteger
でこれを構築することはできません
extension Int {
static func makeRandom(betweenZeroAnd limit: Int) -> Int {
assert(limit > 0)
// Convert our range from [0, Int.max) to [Int.max % limit, Int.max)
// This way, when we later % limit, there will be no bias
let minValue = Int.max % limit
var value = 0
// Keep guessing until we're in the range.
// In theory this could loop forever. It won't. A couple of times at worst
// (mostly because we'll pick some negatives that we'll throw away)
repeat {
value = makeRandom()
} while value < minValue
return value % limit
}
}
:スウィフトで同じアプローチを適用するように見えます。スウィフト4では
このすべてFixedWidthInteger
でクリーンアップされ、そして私たちは、これがより一般的にすることができます。
extension FixedWidthInteger {
static func makeRandom() -> Self {
var result: Self = 0
withUnsafeMutablePointer(to: &result) { resultPtr in
resultPtr.withMemoryRebound(to: UInt8.self, capacity: MemoryLayout<Self>.size) { bytePtr in
SecRandomCopyBytes(nil, MemoryLayout<Self>.size, bytePtr)
}
}
return result
}
static func makeRandom(betweenZeroAnd limit: Self) -> Self {
assert(limit > 0)
// Convert our range from [0, Int.max) to [Int.max % limit, Int.max)
// This way, when we later % limit, there will be no bias
let minValue = Self.max % limit
var value: Self = 0
// Keep guessing until we're in the range.
// In theory this could loop forever. It won't. A couple of times at worst
// (mostly because we'll pick some negatives that we'll throw away)
repeat {
value = makeRandom()
} while value < minValue
return value % limit
}
}
これは私が探しているものだと思います。確かに、 'Integer'のマニュアルページにリンクしてもいいですか?私はどこでもそれを見つけることができません。 –
アップルは、ベータ版が出たときにすべてのSwift 3.1ページを削除しました。あなたswiftdoc(または私の場合は、ダッシュ)のようなアーカイブを振り返らなければならない:http://swiftdoc.org/v3.1/protocol/Integer/ –
- 1. ユーザーの代わりにIMAPサーバーに接続する安全な方法はありますか?
- 2. 暗号化の代わりにSed
- 3. iOSで暗号化キーを保存する安全な方法
- 4. iOSで文字列を対称的に暗号化するための適切かつ安全な方法3 +
- 5. `read`関数に代わる完全な方法はありますか?
- 6. C#で暗号で安全な擬似乱数を生成する方法はありますか?
- 7. PDO子オブジェクトの代わりにPDOExceptionの代わりにCustomExceptionをスローする方法はありますか?
- 8. Readlineに代わる簡単な方法はありますか?
- 9. データベースのクレジットカード情報を安全に暗号化する方法
- 10. エンドツーエンドの暗号化コードを安全に送信する方法
- 11. ハッシュ暗号で安全なログインページを作成する方法は?
- 12. より安全で使いやすく柔軟なC++の代わりにsscanf()
- 13. JSP型の安全性を向上させる方法はありますか?
- 14. フレックスコンテナの「フロート」に代わる方法はありますか?
- 15. LIMITのINに代わる方法はありますか?
- 16. AndroidのViewOverlayに代わる方法はありますか?
- 17. railのauto_linkヘルパーメソッドに代わる方法はありますか?
- 18. Railsのclient_side_validationsに代わる方法はありますか?
- 19. data.tableのdcastに代わる方法はありますか?
- 20. Dataflow 2.1.0のIntrabundleParallelizationに代わる方法はありますか?
- 21. SSLの代わりに - "手動で"暗号化する?
- 22. =記号の代わりに
- 23. iOSの代わりにクォーツコンポーザー
- 24. iOSストーリーボードに代わるXMLはありますか?
- 25. サブストリング機能に代わるより高速な方法はありますか?
- 26. pg_class.relhastriggersは `ALTER TABLE ... DISABLE TRIGGER USER`の代わりに安全ですか?
- 27. PHPからのrootコマンドの実行...安全な方法はありますか?
- 28. raw SQLクエリに代わる方法はありますか?
- 29. githubネットワークグラフビューアに代わる方法はありますか?
- 30. Zend_Search_Luceneに代わる方法はありますか?
iOSと共同で、まったく経験のない、[この機能](https://で開発あなたが本当にCPRNGを求めているのであれば(arc4は技術的にはストリーム暗号ですが、CPRNGのみを望んでいるようです)能力)。では、この関数の何が問題になっていますか? – sascha
@サシャ:私はそれを簡潔に見ていました(私はまもなく質問を更新します)。 ['SecRandomCopyBytes()'](https://developer.apple.com/documentation/security/1399291-secrandomcopybytes)は、「暗号的に安全なランダムバイトの配列を生成する」ように設計されています。私が必要とするのは、与えられた閾値以下の乱数を生成することです。しかし、公正であるために、私は 'SecRandomCopyBytes'でこれを成功裏に達成した人々の例を探しています。 –
次に、いくつかの基本を取り上げる必要があります。 [0,1]での一様サンプリングは、32または64ランダムビット= 4または8ランダムバイトからも開始されます。 – sascha