定時操作: 秘密を守る技術... 秘密! 、ゴークリプト9

DDD
リリース: 2024-11-24 18:32:27
オリジナル
1005 人が閲覧しました

Constant-Time Operations: The Art of Keeping Secrets... Secret! , Go Crypto 9

こんにちは、暗号忍者!定時操作の世界に飛び込む準備はできていますか?これらは、時間だけでも自分が何をしているのかわからないほど、物事をスムーズに行うための芸術だと考えてください。 Go がこの暗号技術の習得にどのように役立つかを見てみましょう!

なぜ定時なのか?タイミングが全てだから!

誰かのパスワードを推測しようとしていると想像してください。システムが「間違っています!」と言ったら、一部の推測が他の推測よりも速い場合、拒否が速いということは、一部の文字が正しいことを意味すると推測するかもしれません。これはタイミング攻撃であり、まさに定時操作が防止するように設計されているものです。

暗号化の世界では、入力に関係なく、操作にかかる時間が同じであることが望まれます。ポーカーフェイスのようなものですが、コードのためです!

一定時間の比較: 秘密のハンドシェイク

最も一般的な定数時間演算は比較です。これは、2 つの秘密の握手が一致するかどうかを確認するのに似ていますが、どれくらい親密であるかについては何のヒントも与えられません。 Go はこれに対して ConstantTimeCompare を提供します:

import (
    "crypto/subtle"
    "fmt"
)

func main() {
    secretHandshake := []byte("up-down-left-right-a-b-start")
    attemptedHandshake := []byte("up-down-left-right-b-a-start")
    correctAttempt := []byte("up-down-left-right-a-b-start")

    // Let's check the wrong attempt
    if subtle.ConstantTimeCompare(secretHandshake, attemptedHandshake) == 1 {
        fmt.Println("You're in the club!")
    } else {
        fmt.Println("Sorry, that's not the secret handshake.")
    }

    // Now the correct attempt
    if subtle.ConstantTimeCompare(secretHandshake, correctAttempt) == 1 {
        fmt.Println("Welcome to the club!")
    } else {
        fmt.Println("Nope, still not right.")
    }
}
ログイン後にコピー

ConstantTimeCompare は、一致の場合は 1 を返し、不一致の場合は 0 を返します。それは、無言でうなずいたり、首を振ったりするようなもので、余分な情報は与えられません!

一定時間の選択: 目に見えない選択

場合によっては、秘密の条件に基づいて 2 つの値の間で選択する必要があります。それは、誰にも誰にも見せずにカードを選ぶようなものです。 Go の ConstantTimeSelect を使用すると、まさにそれが可能になります。

import (
    "crypto/subtle"
    "fmt"
)

func main() {
    secretDoor := uint32(1)
    fakeDoor := uint32(0)
    condition := 1  // This could be the result of a secret operation

    chosenDoor := subtle.ConstantTimeSelect(condition, secretDoor, fakeDoor)
    fmt.Printf("The chosen door is: %d\n", chosenDoor)
}
ログイン後にコピー

どのドアを選んでも、所要時間は同じです。それはまるでマスターマジシャンになったかのようです - 観客はコインがどちらの手にあるかわかりません!

定数時間のブール演算: 秘密のロジック

シークレット値に対して論理演算を実行する必要がある場合があります。 Go の微妙なパッケージが私たちをカバーします:

import (
    "crypto/subtle"
    "fmt"
)

func main() {
    secretBit := 1
    guessedBit := 0

    // Let's do some secret logic
    andResult := subtle.ConstantTimeByteEq(uint8(secretBit & guessedBit), 0)
    orResult := subtle.ConstantTimeByteEq(uint8(secretBit | guessedBit), 0)

    fmt.Printf("AND result is zero: %v\n", andResult == 1)
    fmt.Printf("OR result is zero: %v\n", orResult == 1)
}
ログイン後にコピー

それは頭の中で数学をしているようなものです - あなたがどのような操作を実行しているのか誰もわかりません!

定時操作の黄金律

暗号ステルスの達人になったので、心に留めておくべきいくつかの黄金律を以下に示します。

  1. 機密性の高い比較には常に微妙な.ConstantTimeCompare を使用します: これは、すべての秘密のハンドシェイクが同じ長さに見える特別なメガネを使用するようなものです。

  2. 等しい長さの入力が重要です: ConstantTimeCompare は、等しい長さの入力に対してのみ魔法を発揮します。それは秘密のハンドシェイクを比較するようなものです - 手の数は同じである必要があります!

  3. シークレットベースの選択には ConstantTimeSelect を使用します: シークレットに基づいて選択する必要がある場合、これを使用して選択を維持します...まあ、秘密!

  4. 覚えておいてください、これは操作だけの問題ではありません: 定数時間操作に関するコードからも情報が漏洩する可能性があります。それはまるでマジシャンになったかのようです - トリックそのものだけでなく、すべての動きが重要です。

  5. 独自の暗号をロールしないでください: これらの関数はツールであり、独自の暗号アルゴリズムを発明するよう促すものではありません。それは料理のようなものです - 新しい料理を考案する前にレシピを使用してください!

  6. 一定時間は要素の 1 つにすぎません: これは暗号セキュリティの重要な部分ですが、すべてではありません。常にセキュリティ全体の全体像を考慮してください。

次は何ですか?

おめでとうございます!あなたは暗号ステルスの技術を習得しました。これらのテクニックは、操作を真に秘密にし、最も卑劣なタイミング攻撃にも耐えるのに不可欠です。

暗号の世界では、これらの一定時間の操作は忍者の秘密の動きのようなものであることを覚えておいてください。訓練を受けていない目には見えませんが、真の習得には絶対に不可欠です。

それでは、ConstantTimeCompare を使用して安全なパスワード検証システムを実装してみてはいかがでしょうか?それとも、ConstantTimeSelect を使用して秘密投票システムを作成しますか?タイミング攻撃に強い暗号の世界があなたのすぐそばにあります。コーディングを楽しんでください、暗号忍者!

以上が定時操作: 秘密を守る技術... 秘密! 、ゴークリプト9の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート