web-dev-qa-db-ja.com

トークンの生成と乱数

Swiftサーバーがあり、現在、認証は単純な電子メールとハッシュ化されたパスワードの組み合わせで処理されています。これをアクセストークン(+有効期限)に置き換えて、電子メールのストレージを削除できるようにしますエンドユーザーデバイスの/ passwordは、特定のエンドポイントからのアクセスを簡単に取り消すことができるため、セキュリティがわずかに向上します。

現在、実装はクロスプラットフォームであるため、ローカル(xcode、macOS)で開発できますが、ubuntuボックスで実行できます。したがって、乱数を生成するクロスプラットフォームの方法が必要です。

いくつか検索した後、明らかに/dev/urandomに出くわしたので、私の質問は、これは使用するのに十分安全ですか?または、 arc4random + chacha2 のようなものを使用することを検討する必要があります。もしそうなら、なぜ、この実装は何か良いのでしょうか?

私は長さとして128ビットを使用することを計画しています。64ビットについて読んだだけでは十分に安全ではありません(おそらく私の規模ではそうなるでしょうが)。

参考までに、これが私の現在のデモ実装です。

func random_data(_ length: Int) -> Data? {
    let stream = open("/dev/urandom", O_RDONLY)
    var buffer: [UInt8] = [UInt8](repeating: 0, count: length)

    let result = read(stream, &buffer, length)
    if result < 0 {
        return nil
    }
    return Data(bytes: buffer)
}

コードベースにはタイミング攻撃を防ぐための安全なstrcmp関数がありますが、いずれにせよ、検証のために2つのint64に分割する可能性があります。 P.S.ランダムに生成されたトークンの作業が完了した後、そのメモリをゼロにするかどうかを判断する必要があります。これはSwiftでは面倒な作業です。

2

/dev/urandomはあなたが探しているクロスプラットフォームソリューションです!

@dandavisと@DuncanXSimpsonが言ったように、/dev/urandomはこれに完全に適切であり、すべてのLinuxおよびunixライクなオペレーティングシステムで同じように動作します。 Windowsとクロスプラットフォームになりたい場合は、Windows環境で [〜#〜] capi [〜#〜] を呼び出すためのifステートメントが必要です。

/dev/urandomの内部実装は、Linux、BSD、OSX、およびSolaris間で大幅に異なり、暗号技術者の間で多くの炎上戦争を引き起こしますが、すべてが非ブロッキングであり、すべてが安全であり、すべてが同じように動作することに注意してください。あなたの視点。)


あなた自身を転がすことについての注意

しないでください。 @dandavisが言ったように、ChaChaのようなストリーム暗号を取得し、それからRNGを構築することは、正しく行うのが驚くほど難しいことです。そして、それは実際には微妙な欠陥がたくさんあるのに、それが機能しているように初心者に見えるようなものなので、危険です。

古い格言が行くように:

自分では壊せないシステムを誰でも構築できますが、誰も壊せないシステムを構築できる人はほとんどいません。

/dev/randomおよび/dev/urandomは、暗号化の使用を目的とした確立されたRNGです。それらを自由に利用してください!


/dev/random/dev/urandomについての注意

暗号化で最も長く続いている炎上戦争へようこそ!

これについてグーグル対応のブログ投稿が不足しているわけではありませんが、「常に/dev/randomを使用する」または「常に/dev/urandomを使用する」という記事はすべて間違っており、それぞれに場所があります( FreeBSDとSolarisでは、動作がまったく異なり、randomurandomへのシンボリックリンクであり、クロスプラットフォームの互換性のためにのみ存在します)。

それらの微妙な違いは、/dev/randomは、要求を満たすのに十分な高品質のランダム性があると思わない場合、プログラムをブロックして遅延させるのに対し、/dev/urandomは、品質に関係なく何かを返すことです( 「u」は「無制限」の略です)。これは、特定のエッジケース、特にランダム性を引き出すためのマウス/キーボードのない小さな組み込みデバイスで重要です。

とは言うものの、大量のネットワークトラフィックで1時間以上稼働している、またはハードウェアRNGが組み込まれたプロセッサ(Intelの場合は2013 +、AMDの場合は2015+)で実行されている通常のサーバーの場合、/dev/urandomは完全に大丈夫です。

1
Mike Ounsworth

はい、/dev/urandomは安全です。 代わりに/dev/randomを使用する理由はありません -実際には安全ではありません。

1