ホームページ  >  記事  >  バックエンド開発  >  デジタル署名: あなたの暗号ジョン・ハンコック、Go Crypto 6

デジタル署名: あなたの暗号ジョン・ハンコック、Go Crypto 6

Susan Sarandon
Susan Sarandonオリジナル
2024-11-04 04:24:02745ブラウズ

Digital Signatures: Your Cryptographic John Hancock, Go Crypto 6

やあ、暗号チャンピオン!デジタル署名の世界に飛び込む準備はできていますか?これらはあなたのデジタルサインだと考えてください - あなたがデジタル世界において本当にあなたであること、そしてあなたのメッセージが改ざんされていないことを証明する方法です。 Go がこれらの偽造不可能なデジタル ジョン ハンコックの作成にどのように役立つかを調べてみましょう!

RSA シグネチャー: クラシック オートグラフ

まず、RSA 署名を取得します。それは、本当に高級で偽造不可能なペンで文書に署名するようなものです。

import (
    "crypto"
    "crypto/rand"
    "crypto/rsa"
    "crypto/sha256"
    "fmt"
)

func main() {
    // Let's create our special signing pen (RSA key pair)
    privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
    if err != nil {
        panic("Oops! Our pen ran out of ink.")
    }
    publicKey := &privateKey.PublicKey

    // Our important message
    message := []byte("I solemnly swear that I am up to no good.")

    // Let's create a fingerprint of our message
    hash := sha256.Sum256(message)

    // Time to sign!
    signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hash[:])
    if err != nil {
        panic("Our hand cramped while signing!")
    }

    fmt.Printf("Our RSA signature: %x\n", signature)

    // Now, let's verify our signature
    err = rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, hash[:], signature)
    if err != nil {
        fmt.Println("Uh-oh, someone forged our signature!")
    } else {
        fmt.Println("Signature checks out. Mischief managed!")
    }
}

ECDSA 署名: 曲線的なオートグラフ

次に、ECDSA 署名があります。これは RSA のよりクールで効率的な親戚のようなもので、同じレベルのセキュリティを備えた小さな署名です。

import (
    "crypto/ecdsa"
    "crypto/elliptic"
    "crypto/rand"
    "crypto/sha256"
    "fmt"
    "math/big"
)

func main() {
    // Let's create our curvy signing pen
    privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
    if err != nil {
        panic("Our curvy pen got a bit too curvy!")
    }
    publicKey := &privateKey.PublicKey

    // Our important message
    message := []byte("Elliptic curves are mathematically delicious!")

    // Create a fingerprint of our message
    hash := sha256.Sum256(message)

    // Time to sign with our curvy pen!
    r, s, err := ecdsa.Sign(rand.Reader, privateKey, hash[:])
    if err != nil {
        panic("Our hand slipped while signing these curves!")
    }

    signature := append(r.Bytes(), s.Bytes()...)
    fmt.Printf("Our curvy ECDSA signature: %x\n", signature)

    // Let's verify our curvy signature
    r = new(big.Int).SetBytes(signature[:len(signature)/2])
    s = new(big.Int).SetBytes(signature[len(signature)/2:])
    valid := ecdsa.Verify(publicKey, hash[:], r, s)
    fmt.Printf("Is our curvy signature valid? %v\n", valid)
}

Ed25519 署名: スピード デーモンのサイン

最後に、Ed25519 の署名ができました。これらはデジタル署名のスポーツカーのようなもので、高速かつ安全です。

import (
    "crypto/ed25519"
    "crypto/rand"
    "fmt"
)

func main() {
    // Let's create our speedy signing pen
    publicKey, privateKey, err := ed25519.GenerateKey(rand.Reader)
    if err != nil {
        panic("Our speedy pen got a speeding ticket!")
    }

    // Our important message
    message := []byte("Speed is my middle name!")

    // Time to sign at lightning speed!
    signature := ed25519.Sign(privateKey, message)

    fmt.Printf("Our speedy Ed25519 signature: %x\n", signature)

    // Let's verify our speedy signature
    valid := ed25519.Verify(publicKey, message, signature)
    fmt.Printf("Is our speedy signature valid? %v\n", valid)
}

完璧な署名を選ぶ

さて、「どの署名を使用すればよいでしょうか?」と疑問に思われるかもしれません。まあ、それはあなたのニーズによって異なります:

  1. RSA: それは署名のスイスアーミーナイフのようなものです。広くサポートされていますが、署名は少し分厚いです。
  2. ECDSA: それは中間です。 RSA よりも小さい署名ですが、現在でも広くサポートされています。
  3. Ed25519: 新しく来た子です。超高速で小さい署名ですが、まだどこでもサポートされていない可能性があります。

デジタル署名の黄金律

あなたもシグネチャー アーティストになったので、心に留めておくべきいくつかの黄金律を以下に示します。

  1. ランダム性が鍵: 署名に関連するものには常に crypto/rand を使用します。予測可能なランダム性は、毎回同じ署名を使用するようなものです - 良くありません!

  2. 署名前にハッシュする: Ed25519 を除き、署名する前に必ずメッセージをハッシュします。これは、メッセージの一意のフィンガープリントを作成するようなものです。

  3. サイズは重要です: RSA には少なくとも 2048 ビット、ECDSA には 256 ビットを使用し、Ed25519 は常に 256 ビットです。

  4. ペンを安全に保管してください: 最も貴重な所有物を守るのと同じように、秘密鍵を保護してください。署名キーが盗まれるということは、誰かがあなたのアイデンティティを盗むようなものです!

  5. 検証者を検証する: 署名の検証に使用している公開鍵が正当であることを確認してください。偽の公開キーがあると、偽の署名を信頼してしまう可能性があります!

  6. 可能な場合は標準化します: 他のシステムとうまく連携する必要がある場合は、JSON Web Signature (JWS) などの形式の使用を検討してください。

  7. 卑劣な攻撃に注意してください: 高度なセキュリティのシナリオでは、サイドチャネル攻撃に注意してください。あなたがサインしている間、誰かがあなたの肩越しに覗いているようなものです。

次は何ですか?

おめでとうございます!これで、暗号化ツールキットにデジタル署名が追加されました。これらは、デジタル世界で信頼性と完全性を証明するために非常に重要です。

次に、Go が TLS および X.509 証明書をどのように処理するかを見ていきます。それは、インターネット上での安全な通信に不可欠なデジタル ID カードを作成して検証する方法を学ぶようなものです!

暗号の世界では、これらの基本を理解することが重要であることを覚えておいてください。それは、デジタル時代の基本的なスキルである署名の書き方を学ぶようなものです。これらをマスターすれば、Go で安全な認証済みアプリケーションを作成できるようになります。

それでは、簡単な文書署名システムを導入してみてはいかがでしょうか?それとも、デジタル署名を使用してソフトウェアの更新を検証するプログラムを作成しますか?偽造不可能なデジタルサインの世界があなたのすぐそばにあります!コーディングを楽しんでください、暗号化チャンピオン!

以上がデジタル署名: あなたの暗号ジョン・ハンコック、Go Crypto 6の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。