美文网首页Golang程序员Go知识库
71.加密解密(MD5 SHA1 BASE64 RSA)(一)

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

作者: 厚土火焱 | 来源:发表于2018-09-26 09:40 被阅读92次

    在项目开发中,常会遇到需要加密存储信息的时候,比如密码。密码一般不需要解密。
    对于一些保密要求较高的内容,也要求加密存储,在需要查看的时候,再解密查看。
    为了对服务器和客户端进行身份验证,也会用到加密解密或身份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 RSA
    func 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)
    }
    

    相关文章

      网友评论

        本文标题:71.加密解密(MD5 SHA1 BASE64 RSA)(一)

        本文链接:https://www.haomeiwen.com/subject/zzsznftx.html