LoginSignup
26
17

More than 5 years have passed since last update.

GolangでSHA-256ハッシュ

Last updated at Posted at 2015-06-14
package main

import (
 "fmt"
 "crypto/sha256"
 "crypto/sha512"
 "golang.org/x/crypto/sha3"
 "golang.org/x/crypto/ripemd160"
)

func main() {
  // http://ja.wikipedia.org/wiki/SHA-2#.E3.83.8F.E3.83.83.E3.82.B7.E3.83.A5.E5.80.A4.E3.81.AE.E4.BE.8B
  str := "" // 空の入力に対するハッシュ値

 // sha256.Sum256 は、[]byte を必要とする
 fmt.Printf("SHA-256 : %x\n", sha256.Sum256([]byte(str)))
 // -> e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

 // その他、、、
 // sha512 の場合
 fmt.Printf("SHA-512 : %x\n", sha512.Sum512([]byte(str)))
 // -> cf83e1357eefb8bdf1542850d66d8007......

 // sha3-256 の場合
 fmt.Printf("SHA-3 256 : %x\n", sha3.Sum256([]byte(str)))
 // -> a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a

 // RIPEMD-160 の場合は、New() で、hash.Hash が返ってくるので、
 // Write して Sum する
 rip := ripemd160.New()
 io.WriteString(rip, str)
 fmt.Printf("RIPEMD160 : %x\n", rip.Sum(nil))
 // -> 9c1185a5c5e9fc54612808977ee8f548b2258d31 
}

投稿当初、下記の実装を紹介していましたが、
go1.2で Sum256, Sum512 のfunctionが追加されていました。便利ですね。
@tienlen さんから頂いたコメントの通りです)
以下は、無視してOKです。

package main

import (
 "fmt"
 "io"
 "crypto/sha256"
)

func main() {
  // http://ja.wikipedia.org/wiki/SHA-2#.E3.83.8F.E3.83.83.E3.82.B7.E3.83.A5.E5.80.A4.E3.81.AE.E4.BE.8B
  str := "" // 空の入力に対するハッシュ値

  // crypto/sha256 は、[]byte を必要とする
  s := sha256.New()
  s.Write([]byte(str))
  fmt.Printf("SHA-256 : %x\n", s.Sum(nil))

  // io.WriteString を使う方がキレイかな
  s = sha256.New()
  io.WriteString(s, str)
  fmt.Printf("SHA-256 : %x\n", s.Sum(nil))

  // どちらも e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
}

The Go Playground

他のハッシュライブラリも、hash.Hash インタフェースに合わせて実装されているので、
SHA-512 の場合も同じように、crypto/sha512 を使えば良いし、
例えば、RIPEMD-160 とか、SHA-3 のライブラリは、
code.google.com/p/go.crypto
にあるけど、同じように使えます。

package main

import (
 "fmt"
 "io"
 "code.google.com/p/go.crypto/ripemd160"
 "code.google.com/p/go.crypto/sha3"
)

func main() {
  str := "" // 空の入力に対するハッシュ値
  rip := ripemd160.New()
  io.WriteString(rip, str)
  fmt.Printf("RIPEMD160 : %x\n", rip.Sum(nil))

  // 9c1185a5c5e9fc54612808977ee8f548b2258d31

  sh3 := sha3.New256()
  io.WriteString(sh3, str)
  fmt.Printf("SHA-3 256 : %x\n", sh3.Sum(nil))

  // a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a
}
26
17
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
17