Go - 經常使用簽名算法的基準測試

簽名驗證是爲了保證接口安全和識別調用方身份,同時還須要知足如下幾點:git

  • 可變性:每次的簽名必須是不同的。
  • 時效性:每次請求的時效性,過時做廢。
  • 惟一性:每次的簽名是惟一的。
  • 完整性:可以對傳入數據進行驗證,防止篡改。

簽名規則大同小異,根據本身的業務狀況進行制定便可。github

簽名過程當中咱們會用到的幾種算法,接下來分享一下每一個算法的基準測試,可能會存在偏差,供你們參考。算法

MD5 單向散列加密

func BenchmarkEncrypt(b *testing.B) {
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        New().Encrypt("123456")
    }
}

// 輸出
goos: darwin
goarch: amd64
pkg: github.com/xinliangnote/go-gin-api/pkg/md5
BenchmarkEncrypt-12        10000000           238 ns/op
PASS

AES 對稱加密

func BenchmarkEncryptAndDecrypt(b *testing.B) {
    b.ResetTimer()
    aes := New(key, iv)
    for i := 0; i < b.N; i++ {
        encryptString, _ := aes.Encrypt("123456")
        aes.Decrypt(encryptString)
    }
}

// 輸出
goos: darwin
goarch: amd64
pkg: github.com/xinliangnote/go-gin-api/pkg/aes
BenchmarkEncryptAndDecrypt-12         1000000          1009 ns/op
PASS

RSA 非對稱加密

func BenchmarkEncryptAndDecrypt(b *testing.B) {
    b.ResetTimer()
    rsaPublic := NewPublic(publicKey)
    rsaPrivate := NewPrivate(privateKey)
    for i := 0; i < b.N; i++ {
        encryptString, _ := rsaPublic.Encrypt("123456")
        rsaPrivate.Decrypt(encryptString)
    }
}

// 輸出
goos: darwin
goarch: amd64
pkg: github.com/xinliangnote/go-gin-api/pkg/rsa
BenchmarkEncryptAndDecrypt-12            1000       1345384 ns/op
PASS

最後

JWT 的簽名驗證也使用過,分享一下 JWT 的基準測試,使用的是 jwt.SigningMethodHS256 方法。api

func BenchmarkSignAndParse(b *testing.B) {
    b.ResetTimer()
    token := New(secret)
    for i := 0; i < b.N; i++ {
        tokenString, _ := token.Sign(123456789, "xinliangnote")
        token.Parse(tokenString)
    }
}

// 輸出
goos: darwin
goarch: amd64
pkg: github.com/xinliangnote/go-gin-api/pkg/token
BenchmarkSignAndParse-12          200000         11749 ns/op
PASS

以上代碼在 go-gin-api 項目中,地址:https://github.com/xinliangno...安全

相關文章
相關標籤/搜索