㈠ 有沒有人用golang實現過restful框架的實例
通過beego快速創建一個Restful風格API項目及API文檔自動化: http://www.cnblogs.com/huligong1234/p/4707282.html
Go 語言構建 RESTful Web 服務: https://www.oschina.net/translate/hardcore-google-communicating-go
Golang中使用 JWT認證來 保障Restful JSON API的安全(英文): http://www.tuicool.com/articles/ZnMZF3
polaris: 一個用go實現的支持restful的web框架: http://blog.csdn.net/siddontang/article/details/21088451
關於RESTFUL API 安全認證方式的一些總結: http://www.cnblogs.com/Irving/p/4964489.html
有沒有人用golang實現過restful框架的實例: http://www.golangtc.com/t/53ba35e9320b52466c00000f
Micro 一個用Go語言實現的微服務框架: http://www.tuicool.com/articles/nqQfYb
基於微服務庫的可插拔RPC go-micro: http://www.oschina.net/p/go-micro
golang適合做web開發嗎?: https://www.hu.com/question/30649593
a-survey-of-5-go-web-frameworks: http://thenewstack.io/a-survey-of-5-go-web-frameworks/
Ozzo Framework: https://github.com/go-ozzo
avelino/awesome-go: https://github.com/avelino/awesome-go#web-frameworks
Beego Framework: https://beego.me/
golang其實不適合做web開發: http://www.golangtc.com/t/5598f78ab09ecc0f51000014
Go語言現有Web開發框架: http://studygolang.com/resources/71
使用Golang快速構建WEB應用: http://blog.jobbole.com/84884/
Martini 極好的 Go WEB 框架: https://my.oschina.net/achun/blog/190909
golang 有哪些比較穩定的 web 開發框架?: https://www.hu.com/question/21038038
㈡ nodejs的aes+rsa 加密,用golang怎麼寫
密碼自身只能加密長度等於密碼塊長度的單塊數據,若要加密變長數據,則數據必須先被劃分為一些單獨的密碼塊。通常而言,最後一塊數據也需要使用合適填充方式將數據擴展到符合密碼塊大小的長度。
一種工作模式描述了加密每一數據塊的過程,並常常使用基於一個通常稱為初始化向量的附加輸入值以進行隨機化,以保證安全。
常見的模式有ECB,CBC,OFB,CFB,CTR和XTS等!
㈢ base64加密中文亂碼 golang 怎麼解決
測試沒問題
python">chinese:="簡體中文"
str1:=base64.StdEncoding.EncodeToString([]byte(chinese))
fmt.Println(str1)
str2,_:=base64.StdEncoding.DecodeString(str1)
fmt.Println(string(str2))
㈣ 什麼是3DES對稱加密演算法
DES加密經過下面的步驟
1、提供明文和密鑰,將明文按照64bit分塊(對應8個位元組),不足8個位元組的可以進行填充(填充方式多種),密鑰必須為8個位元組共64bit
填充方式:
當明文長度不為分組長度的整數倍時,需要在最後一個分組中填充一些數據使其湊滿一個分組長度。
* NoPadding
API或演算法本身不對數據進行處理,加密數據由加密雙方約定填補演算法。例如若對字元串數據進行加解密,可以補充\0或者空格,然後trim
* PKCS5Padding
加密前:數據位元組長度對8取余,余數為m,若m>0,則補足8-m個位元組,位元組數值為8-m,即差幾個位元組就補幾個位元組,位元組數值即為補充的位元組數,若為0則補充8個位元組的8
解密後:取最後一個位元組,值為m,則從數據尾部刪除m個位元組,剩餘數據即為加密前的原文。
例如:加密字元串為為AAA,則補位為AAA55555;加密字元串為BBBBBB,則補位為BBBBBB22;加密字元串為CCCCCCCC,則補位為CCCCCCCC88888888。
* PKCS7Padding
PKCS7Padding 的填充方式和PKCS5Padding 填充方式一樣。只是加密塊的位元組數不同。PKCS5Padding明確定義了加密塊是8位元組,PKCS7Padding加密快可以是1-255之間。
2、選擇加密模式
**ECB模式** 全稱Electronic Codebook模式,譯為電子密碼本模式
**CBC模式** 全稱Cipher Block Chaining模式,譯為密文分組鏈接模式
**CFB模式** 全稱Cipher FeedBack模式,譯為密文反饋模式
**OFB模式** 全稱Output Feedback模式,譯為輸出反饋模式。
**CTR模式** 全稱Counter模式,譯為計數器模式。
3、開始加密明文(內部原理--加密步驟,加密演算法實現不做講解)
image
1、將分塊的64bit一組組加密,示列其中一組:將此組進行初始置換(IP置換),目的是將輸入的64位數據塊按位重新組合,並把輸出分為L0、R0兩部分,每部分各長32位。
2、開始Feistel結構的16次轉換,第一次轉換為:右側數據R0和子密鑰經過輪函數f生成用於加密左側數據的比特序列,與左側數據L0異或運算,
運算結果輸出為加密後的左側L0,右側數據則直接輸出為右側R0。由於一次Feistel輪並不會加密右側,因此需要將上一輪輸出後的左右兩側對調後才正式完成一次Feistel加密,
3、DES演算法共計進行16次Feistel輪,最後一輪輸出後左右兩側無需對調,每次加密的子密鑰不相同,子密鑰是通過秘鑰計算得到的。
4、末置換是初始置換的逆過程,DES最後一輪後,左、右兩半部分並未進行交換,而是兩部分合並形成一個分組做為末置換的輸入
DES解密經過下面的步驟
1、拿到密文和加密的密鑰
2、解密:DES加密和解密的過程一致,均使用Feistel網路實現,區別僅在於解密時,密文作為輸入,並逆序使用子密鑰。
3、講解密後的明文去填充 (padding)得到的即為明文
Golang實現DES加密解密
package main
import (
"fmt"
"crypto/des"
"bytes"
"crypto/cipher"
)
func main() {
var miwen,_= DESEncode([]byte("hello world"),[]byte("12345678"))
fmt.Println(miwen) // [11 42 146 232 31 180 156 225 164 50 102 170 202 234 123 129],密文:最後5位是補碼
var txt,_ = DESDecode(miwen,[]byte("12345678"))
fmt.Println(txt) // [104 101 108 108 111 32 119 111 114 108 100]明碼
fmt.Printf("%s",txt) // hello world
}
// 加密函數
func DESEncode(orignData, key []byte)([]byte,error){
// 建立密碼塊
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}
// 明文分組,不足的部分加padding
txt := PKCS5Padding(orignData,block.BlockSize())
// 設定加密模式,為了方便,初始向量直接使用key充當了(實際項目中,最好別這么做)
blockMode := cipher.NewCBCEncrypter(block,key)
// 創建密文長度的切片,用來存放密文位元組
crypted :=make([]byte,len(txt))
// 開始加密,將txt作為源,crypted作為目的切片輸入
blockMode.CryptBlocks(crypted,txt)
// 將加密後的切片返回
return crypted,nil
}
// 加密所需padding
func PKCS5Padding(ciphertext []byte,size int)[]byte{
padding := size - len(ciphertext)%size
padTex := bytes.Repeat([]byte{byte(padding)},padding)
return append(ciphertext,padTex...)
}
// 解密函數
func DESDecode(cripter, key []byte) ([]byte,error) {
// 建立密碼塊
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}
// 設置解密模式,加密模式和解密模式要一樣
blockMode := cipher.NewCBCDecrypter(block,key)
// 設置切片長度,用來存放明文位元組
originData := make([]byte,len(cripter))
// 使用解密模式解密,將解密後的明文位元組放入originData 切片中
blockMode.CryptBlocks(originData,cripter)
// 去除加密的padding部分
strByt := UnPKCS5Padding(origenData)
return strByt,nil
}
// 解密所需要的Unpadding
func UnPKCS5Padding(origin []byte) []byte{
// 獲取最後一位轉為整型,然後根據這個整型截取掉整型數量的長度
// 若此數為5,則減掉轉換明文後的最後5位,即為我們輸入的明文
var last = int(origin[len(origin)-1])
return origin[:len(origin)-last]
}
注意:在設置加密模式為CBC的時候,我們需要設置一個初始化向量,這個量的意思 在對稱加密演算法中,如果只有一個密鑰來加密數據的話,明文中的相同文字就會也會被加密成相同的密文,這樣密文和明文就有完全相同的結構,容易破解,如果給一個初始化向量,第一個明文使用初始化向量混合並加密,第二個明文用第一個明文的加密後的密文與第二個明文混合加密,這樣加密出來的密文的結構則完全與明文不同,更加安全可靠。CBC模式圖如下
CBC
3DES
DES 的常見變體是三重 DES,使用 168 位的密鑰對資料進行三次加密的一種機制;它通常(但非始終)提供極其強大的安全性。如果三個 56 位的子元素都相同,則三重 DES 向後兼容 DES。
對比DES,發現只是換了NewTripleDESCipher。不過,需要注意的是,密鑰長度必須24byte,否則直接返回錯誤。關於這一點,PHP中卻不是這樣的,只要是8byte以上就行;而Java中,要求必須是24byte以上,內部會取前24byte(相當於就是24byte)。另外,初始化向量長度是8byte(目前各個語言都是如此,不是8byte會有問題)
㈤ 如何用nodejs 解密 通過golang加密的文件
以下代碼採用AES192,128的類似
var crypto = require('crypto');var key = crypto.randomBytes(192/8); // 替換成自己需要的keyvar iv = crypto.randomBytes(128/8); // 替換成自己需要的ivvar algorithm = 'aes192';function encrypt(text){ var cipher = crypto.createCipheriv(algorithm, key, iv);
cipher.update(text); return cipher.final('hex');
}function decrypt(encrypted){ var decipher = crypto.createDecipheriv(algorithm, key, iv);
decipher.update(encrypted, 'hex'); return decipher.final('utf8');
}var content = 'hello';var crypted = encrypt('hello');console.log( crypted ); // 輸出: decrypted = decrypt( crypted );console.log( decrypted ); // 輸出:he