やあ、暗号チャンピオン!デジタル署名の世界に飛び込む準備はできていますか?これらはあなたのデジタルサインだと考えてください - あなたがデジタル世界において本当にあなたであること、そしてあなたのメッセージが改ざんされていないことを証明する方法です。 Go がこれらの偽造不可能なデジタル ジョン ハンコックの作成にどのように役立つかを調べてみましょう!
まず、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 署名があります。これは 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 の署名ができました。これらはデジタル署名のスポーツカーのようなもので、高速かつ安全です。
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) }
さて、「どの署名を使用すればよいでしょうか?」と疑問に思われるかもしれません。まあ、それはあなたのニーズによって異なります:
あなたもシグネチャー アーティストになったので、心に留めておくべきいくつかの黄金律を以下に示します。
ランダム性が鍵: 署名に関連するものには常に crypto/rand を使用します。予測可能なランダム性は、毎回同じ署名を使用するようなものです - 良くありません!
署名前にハッシュする: Ed25519 を除き、署名する前に必ずメッセージをハッシュします。これは、メッセージの一意のフィンガープリントを作成するようなものです。
サイズは重要です: RSA には少なくとも 2048 ビット、ECDSA には 256 ビットを使用し、Ed25519 は常に 256 ビットです。
ペンを安全に保管してください: 最も貴重な所有物を守るのと同じように、秘密鍵を保護してください。署名キーが盗まれるということは、誰かがあなたのアイデンティティを盗むようなものです!
検証者を検証する: 署名の検証に使用している公開鍵が正当であることを確認してください。偽の公開キーがあると、偽の署名を信頼してしまう可能性があります!
可能な場合は標準化します: 他のシステムとうまく連携する必要がある場合は、JSON Web Signature (JWS) などの形式の使用を検討してください。
卑劣な攻撃に注意してください: 高度なセキュリティのシナリオでは、サイドチャネル攻撃に注意してください。あなたがサインしている間、誰かがあなたの肩越しに覗いているようなものです。
おめでとうございます!これで、暗号化ツールキットにデジタル署名が追加されました。これらは、デジタル世界で信頼性と完全性を証明するために非常に重要です。
次に、Go が TLS および X.509 証明書をどのように処理するかを見ていきます。それは、インターネット上での安全な通信に不可欠なデジタル ID カードを作成して検証する方法を学ぶようなものです!
暗号の世界では、これらの基本を理解することが重要であることを覚えておいてください。それは、デジタル時代の基本的なスキルである署名の書き方を学ぶようなものです。これらをマスターすれば、Go で安全な認証済みアプリケーションを作成できるようになります。
それでは、簡単な文書署名システムを導入してみてはいかがでしょうか?それとも、デジタル署名を使用してソフトウェアの更新を検証するプログラムを作成しますか?偽造不可能なデジタルサインの世界があなたのすぐそばにあります!コーディングを楽しんでください、暗号化チャンピオン!
以上がデジタル署名: あなたの暗号ジョン・ハンコック、Go Crypto 6の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。