继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

71.加密解密(MD5 SHA1 BASE64 RSA)(一)

慕虎7371278
关注TA
已关注
手记 1125
粉丝 201
获赞 871

在项目开发中,常会遇到需要加密存储信息的时候,比如密码。密码一般不需要解密。
对于一些保密要求较高的内容,也要求加密存储,在需要查看的时候,再解密查看。
为了对服务器和客户端进行身份验证,也会用到加密解密或身份id的判定等情况。
一般单向加密(不可解密)的方法,常见的有md5、sha1等。
加密解密双向需求的,常用base64。
对服务端、客户端等的验证,常用非对称加密rsa。
为了实践一下这些方法,先建立一个模板页。
模板页面

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>Go Cryptography SHA1 MD5 BASE64 RSA</title></head><body>加密解密等<hr color="#e8e8e8" size="1"><form id="cryptoform" action="../cryptography/" method="post">
    md5 --> 原文:     <textarea  id="sourcecontentmd5" name="sourcecontentmd5" >{{.sourcecontentmd5}}</textarea><br>
    md5 --> 密文:     <textarea  id="cryptocontentmd5" name="cryptocontentmd5" >{{.cryptocontentmd5}}</textarea><br>
    sha1 --> 原文:    <textarea  id="sourcecontentsha1" name="sourcecontentsha1" >{{.sourcecontentsha1}}</textarea><br>
    sha1 --> 密文:    <textarea  id="cryptocontentsha1" name="cryptocontentsha1" >{{.cryptocontentsha1}}</textarea><br>
    <br><br><br>
    <input type="radio" name="sc" value="0" {{.sc0}}>加密    <input type="radio" name="sc" value="1" {{.sc1}}>解密    <br>
    base64 --> 原文:  <textarea  id="sourcecontentbase64" name="sourcecontentbase64" >{{.sourcecontentbase64}}</textarea><br>
    base64 --> 密文:  <textarea  id="cryptocontentbase64" name="cryptocontentbase64" >{{.cryptocontentbase64}}</textarea><br>
    rsa --> 原文:     <textarea  id="sourcecontentrsa" name="sourcecontentrsa" >{{.sourcecontentrsa}}</textarea><br>
    rsa --> 密文:     <textarea  id="cryptocontentrsa" name="cryptocontentrsa" >{{.cryptocontentrsa}}</textarea><br>
    <br><br>
    <input id="submit" type="submit" value="-=提交=-"><br>
    <label id="guid" >{{.guid}}</label></form></body></html>

路径

http.HandleFunc("/cryptography/", processCryptographyHandler)

首先加密的时候,避免空白内容,也为了避免加密内容被猜测,在需要加密的原文前后分别加上一个散列值(hashHeader、hashFooter)。
这两个值都是常量,一旦使用了就不能更改了,不然修改之前的密文就无法使用了。

const (
    hashHeader  = "Ji.anJ.un.bo" //散列值,设置后,若启用则不要再改变了
    hashFooter  = "201410171695" //散列值,设置后,若启用则不要再改变了)
md5加密

md5加密,给出需要加密的原文,在原文前后分别加上hashHeader、hashFooter变量,然后再加密。返回加密后的密文。函数写法如下

/**md5加密,无解密*/func JoelGetingMD5String(s string) string {    h := md5.New()
    h.Write([]byte(hashHeader + s + hashFooter))
    return hex.EncodeToString(h.Sum(nil))
}
sha1加密

sha1加密,给出需要加密的原文,在原文前后分别加上hashHeader、hashFooter变量,然后再加密。返回加密后的密文。函数写法如下

/**SHA1加密,无解密*/func JoelGetingSHA1String(s string) string {    t := sha1.New()
    t.Write([]byte(hashHeader + s + hashFooter))
    return hex.EncodeToString(t.Sum(nil))
}
base64加密解密

使用base64可以实现对原文的加密,和对密文的解密。
首先需要一个64编码表。我们编写一个64个符号的编码表出来。放在变量代码块中。

base64Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-"

这个64位编码表的64个元素不可以重复。加密解密编码的基础。当然,你也可以试着改变这里的元素顺序,或者用其他符号替换其中的元素。(不要使用换行符号)
加解密前声明一个NewEncoding,在加密解密中会用到。

var joelHashCoderBase64 = base64.NewEncoding(base64Table)

然后就是加密和解密函数了

/**base64加密*/func JoelGetingBase64Encoding(s string) string {
    var src []byte = []byte(hashHeader + s + hashFooter)    return string([]byte(joelHashCoderBase64.EncodeToString(src)))
}/**base64解密*/func JoelGetingBase64Decoding(s string) (string, error) {
    var src []byte = []byte(s)
    sourcecode, err := joelHashCoderBase64.DecodeString(string(src))
    var source = string(sourcecode)    //去掉头部
    source1 := strings.Replace(source, hashHeader, "", -1)    //去掉尾部
    source2 := strings.Replace(source1, hashFooter, "", len(source)-len(hashFooter)-1)    return source2, err
}

利用md5和base64也能够生成guid,这在需要随机一个id的时候很有用。

/**返回一个Guid值*/func JoelGetGuid() string {
    b := make([]byte, 48)    if _, err := io.ReadFull(rand.Reader, b); err != nil{        return ""
    }    return JoelGetingMD5String(base64.URLEncoding.EncodeToString(b))
}

这些的调用相对要简单些。
我们使用一个模板页提交和显示加解密的原文与密文。由于有加密和解密2种操作,所以再增加一个当前是加密还是解密的判断。这个就用sc来承担了。
guid只是生成一下,相对就更简单。

//加密解密相关 SHA1 BASE64 MD5 RSAfunc processCryptographyHandler(writer http.ResponseWriter, request *http.Request) {    var sourcecontentmd5 = request.FormValue("sourcecontentmd5")    var cryptocontentmd5 = request.FormValue("cryptocontentmd5")    var sourcecontentsha1 = request.FormValue("sourcecontentsha1")    var cryptocontentsha1 = request.FormValue("cryptocontentsha1")    var sourcecontentbase64 = request.FormValue("sourcecontentbase64")    var cryptocontentbase64 = request.FormValue("cryptocontentbase64")    var sourcecontentrsa = request.FormValue("sourcecontentrsa")    var cryptocontentrsa = request.FormValue("cryptocontentrsa")    var sc = request.FormValue("sc")    //md5加密
    cryptocontentmd5 = JoelCryptography.JoelGetingMD5String(sourcecontentmd5)    //SHA1加密
    cryptocontentsha1 = JoelCryptography.JoelGetingSHA1String(sourcecontentsha1)    if sc == "0"{        //加密
        //--base64加密
        cryptocontentbase64 = JoelCryptography.JoelGetingBase64Encoding(sourcecontentbase64)
    }else {        //解密
        //--base64解密
        source64, err := JoelCryptography.JoelGetingBase64Decoding(cryptocontentbase64)        if err != nil{
            sourcecontentbase64 = err.Error()
        }else {
            sourcecontentbase64 = source64
        }
    }    var jcrypto = make(map[string]string)
    jcrypto["sourcecontentmd5"] = sourcecontentmd5
    jcrypto["cryptocontentmd5"] = cryptocontentmd5
    jcrypto["sourcecontentsha1"] = sourcecontentsha1
    jcrypto["cryptocontentsha1"] = cryptocontentsha1
    jcrypto["sourcecontentbase64"] = sourcecontentbase64
    jcrypto["cryptocontentbase64"] = cryptocontentbase64
    jcrypto["sourcecontentrsa"] = sourcecontentrsa
    jcrypto["cryptocontentrsa"] = cryptocontentrsa
    jcrypto["guid"] = JoelCryptography.JoelGetGuid()    if sc == "0"{
        jcrypto["sc0"] = "checked"
        jcrypto["sc1"] = ""
    }else {
        jcrypto["sc0"] = ""
        jcrypto["sc1"] = "checked"
    }



    t, _ := template.ParseFiles("./JoelTempWeb/tmplCrypto.html")
    t.ExecuteTemplate(writer, "tmplCrypto.html", jcrypto)
}



作者:厚土火烟
链接:https://www.jianshu.com/p/d489bd533ac9


打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP