目次
一、编码算法
1、URL编码
2、Base64编码
二、常见的哈希算法总结
ホームページ Java &#&チュートリアル Java 暗号化とセキュリティの例の分析

Java 暗号化とセキュリティの例の分析

Apr 26, 2023 am 08:04 AM
java

    一、编码算法

    常见的编码有ASCII码、Unicode编码。

    字母A的编码是十六进制的0x41,字母B是0x42,以此类推;ASCII只能用于英文编码,最多只能有127个字符。要想对更多的文字进行编码,就需要用占用两个字节的Unicode.而中文的“中”字使用Unicode编码就是0x4e2d,使用UTF-8则需要3个字节编码。

    所以,最简单的编码是直接给每个字符指定一个若干字节表示的整数,复杂一点的编码就需要根据已有的编码推算出来。比如UTF-8编码,它是一种不定长编码,但可以从给定字符的Unicode编码推算出来。

    1、URL编码

    1.1概念

    URL编码是浏览器发送给服务器时使用的编码,它通常附加在URL的参数部分,eg

    https://www.baidu.com/s?wd=%E6%9D%A8%E9%A2%96

    之所以需要URL编码,是因为处于兼容性考虑,很多服务器只识别ASCII字符。但如果URL中包含中文,日文这些非ASCII字符怎么办?URL编码有一套规则:

    ·如果字符是A~z,a~z, 0~9以及-,_,.,*,则保持不变;

    ·如果是其他字符,先转换为UTF-8编码,然后对每个字节以%xx表示。

    例如:字符"中"的UTF-8编码是0xe4b8ad,因此,它的URL编码是%E4%B8%AD。URL编码总是大写。

    1.2代码示例(编码和解码)

    对URL中的中文进行编码

    package com.yy.demo01;
     
    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
     
    public class Test01 {
        public static void main(String[] args) throws UnsupportedEncodingException {
            String url  = "http://www.baidu.com/s?wd=";
            String value = "杨颖";
            
            //对URL中的中文进行编码
            String result = URLEncoder.encode(value, "utf-8");
            System.out.println("URL参数:" + result);
            System.out.println("完整网址:" + (url+result));
            
            
        }
     
    }
    ログイン後にコピー

    Java 暗号化とセキュリティの例の分析

    对URL中的中文进行解码

    package com.yy.demo01;
     
    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
     
    public class Test01 {
        public static void main(String[] args) throws UnsupportedEncodingException {
            
            //对URL中的中文进行解码
            String param = "https://www.baidu.com/s?wd=
                         %E6%88%91%E6%9C%AC%E5%B0%86%E5%BF%83%E5%90%91%E6%98%8E%E6%9C%88\r\n";
            String conent = URLDecoder.decode(param, "utf-8");
            System.out.println(conent);
        }
     
    }
    ログイン後にコピー

    Java 暗号化とセキュリティの例の分析

    注意:URL编码是编码算法,不是加密算法。

    URL编码目的:把任意文本数据编码为%前缀表示的文本,编码后的文本仅包含A-Z,a-z,0-9,-,_,.,*和%,便于浏览器和服务器处理。

    2、Base64编码

    2.1基本概念

    URL 编码是对字符进行编码,表示成%xx的形式,而Base64编码是对二进制数据进行编码,表示成文本格式。

    Base64编码可以把任意长度的二进制数据变为纯文本,并且纯文本内容中且只包含指定字符内容:A~2 .a~z、0~9、+、7、日。它的原理是把3字节的二进制数据按6bit一组,用4个int整数表示,然后查表,把int整数用索引对应到字符,得到的字符串。

    6位整数的范围总是e ~63,所以,能用64个字符表示:字符A~z 对应索引e~ 25,字符a~z对应索引26~5

    2.2在java中,二进制数据就是byte[ ] 数组、Java标准库提供Base64来对byte[ ]数组进行编码

    编码代码示例:使用Base64.getEncoder().encodeToString("xxxx".getBytes())方法进行编码(它返回值为一个字节数组,所以编码内容要转换为字节!)。

    Java 暗号化とセキュリティの例の分析

    package com.yy.demo01;
     
    import java.io.UnsupportedEncodingException;
    import java.nio.charset.StandardCharsets;
    import java.util.Base64;
     
    public class Test02 {
        public static void main(String[] args) throws UnsupportedEncodingException {
            String content = "红尘客栈风似刀,骤雨落宿命敲";
            String result = Base64.getEncoder().encodeToString(content.getBytes());
            System.out.println(result);
            
        }
     
    }
    ログイン後にコピー

    Java 暗号化とセキュリティの例の分析

    解码内容

    使用Base64.getDecoder().decode(str)方法进行解码

    package com.yy.demo01;
     
    import java.io.UnsupportedEncodingException;
    import java.nio.charset.StandardCharsets;
    import java.util.Base64;
     
    public class Test02 {
        public static void main(String[] args) throws UnsupportedEncodingException {
            
            String str = "57qi5bCY5a6i5qCI6aOO5Ly85YiA77yM6aqk6Zuo6JC95a6/5ZG95pWy";
            byte[] byteArray = Base64.getDecoder().decode(str);
            String line = new String(byteArray,"utf-8");
            System.out.printf("解码后:" +line);
            
        }
     
    }
    ログイン後にコピー

    Java 暗号化とセキュリティの例の分析

    2.3、用Base64进行图片的编码和解码

    先使用Files.readAllBytes(Paths.get("图片的本地路径"))读取图片的字节数组,然后使用Base64.getEncoder().encodeToString(读取到的图片的字节数组)来进行编码,转化成字符串类型。使用Base64.getDecoder().decode(图片的字符串)解码,Files.write()写入指定路径。

    package com.yy.demo01;
     
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.Base64;
     
    public class Test03 {
        public static void main(String[] args) throws IOException {
            //读取图片(字节数组)
            byte[] imageByteArray = Files.readAllBytes(Paths.get("C:\\Users\\LENOVO\\Pictures\\Saved Pictures\\QQ图片20220505163951.jpg"));
            
            //将字节数组进行Base64编码,转换成“字符串形式”
            String imageDataStr = Base64.getEncoder().encodeToString(imageByteArray);
            System.out.println(imageDataStr);
            
            //Base64解码
            byte[] imageResultByteArray = Base64.getDecoder().decode(imageDataStr);
            Files.write(Paths.get("D:\\1\\3\\难哄.jpg"), imageResultByteArray);
        }
     
    }
    ログイン後にコピー

    Java 暗号化とセキュリティの例の分析

    2.4、从文本文件中读取Mp3文件

    package com.yy.demo01;
     
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.Base64;
    import java.util.List;
     
    public class Test05 {
        public static void main(String[] args) throws IOException {
            //从文本文件中读取Mp3文件
            List<String> lines = Files.readAllLines(Paths.get("C:\\Users\\LENOVO\\Documents\\Tencent Files\\2452845234\\FileRecv\\mojito.txt"));
            
            StringBuilder sb = new StringBuilder();
            
            for(String ln : lines) {
                sb.append(ln);
            }
            
            //Base解码
            byte[] mp3ArrayBase = Base64.getDecoder().decode(sb.toString());
            Files.write(Paths.get("D:\\1\\3\\mojito.mp3"), mp3ArrayBase);
        }
     
    }
    ログイン後にコピー

    二、常见的哈希算法总结

    哈希算法(Hash)又称摘要算法(Digest),它的作业是:对任意一组输入数据进行计算,得到一个固定长度的输出摘要。哈希算法的目的是;为了验证原始数据是否被篡改。

    哈希算法最重要的特点就是:

    .相同的输入一定得到相同的输出

    .不同的输入大概率得到不同的输出

    Java字符串的hashCode()就是一个哈希算法输入是任意字符串,输出的是固定的4字节int整数;

    "hello".hashCode(); // 0x5e918d2
    "hello, java".hashCode(); // 0x7a9d88e8
    "hello, bob".hashCode(); // 0xa0dbae2f
    ログイン後にコピー

    哈希碰撞

    两个不同的输入得到了相同的输出:

    "AaAaAa".hashCode(); // 0x7460e8c0
    "BBAaBB".hashCode(); // 0x7460e8c0
     
    "通话".hashCode(); // 0x11ff03
    "重地".hashCode(); // 0x11ff03
    ログイン後にコピー

    常用哈希算法:MD

    Java 暗号化とセキュリティの例の分析

    "MD5"算法加密普通字符串

    package com.yy.demo02;
     
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
     
    public class Test02 {
        public static void main(String[] args) {
            String passWord = "hckzfsd1";
            //7d18b6dc254c73427481f3083a3669
            //7d18b6dc254c734274810f30083a3669
            try {
                MessageDigest digest = MessageDigest.getInstance("MD5");
                digest.update(passWord.getBytes());
                
                byte[] resultByteArray = digest.digest();
                StringBuilder result = new StringBuilder();
                
                for(byte bite:resultByteArray) {
                    result.append(String.format("%02x", bite));
                }
                
                System.out.println(result);
                System.out.println(result.length());
                
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
        }
     
    }
    ログイン後にコピー

    Java 暗号化とセキュリティの例の分析

    MD5算法加密图片

    package com.yy.demo02;
     
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
     
    public class Test03 {
        public static void main(String[] args) {
            try {
                byte[] imageByteArray = Files.readAllBytes(Paths.get("D:\\1\\3\\周杰伦.jpg"));
                
                MessageDigest digest = MessageDigest.getInstance("MD5");
                digest.update(imageByteArray);
                
                byte[] resultByteArray = digest.digest();
                System.out.println(Arrays.toString(resultByteArray));
                System.out.println(resultByteArray.length);
                
                StringBuilder digestResult = new StringBuilder();
                for(byte b : resultByteArray) {
                    digestResult.append(String.format("%02x", b));
                }
                System.out.println(digestResult);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
     
    }
    ログイン後にコピー

    Java 暗号化とセキュリティの例の分析

    "SHA-1"算法加密普通字符串

    package com.yy.demo02;
     
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
    import java.util.UUID;
     
    public class Test04 {
        public static void main(String[] args) {
            String passWord = "wbjxxmy";
            String salt = UUID.randomUUID().toString().substring(0, 5);
            System.out.println(salt);
            
            try {
                MessageDigest digest = MessageDigest.getInstance("SHA-1");
                digest.update(passWord.getBytes());
                digest.update(salt.getBytes());
                
                byte[] resultByteArray = digest.digest();
                System.out.println(Arrays.toString(resultByteArray));
                System.out.println(resultByteArray.length);
                
                StringBuilder result = new StringBuilder();
                for(byte b : resultByteArray) {
                    result.append(String.format("%02x", b));
                }
                System.out.println(result);
                
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
        }
        
     
    }
    ログイン後にコピー

    "HmacMD5"加密普通字符串

    package com.yy.demo02;
     
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
     
    import javax.crypto.KeyGenerator;
    import javax.crypto.Mac;
    import javax.crypto.SecretKey;
     
    public class Test06 {
        public static void main(String[] args) {
            String passWord = "zylsmq";
            try {
                //1.生成秘钥
                //秘钥生成器KeyGenerator
                KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
                
                //生成秘钥
                SecretKey key = keyGen.generateKey();
                
                //获取秘钥key的字节数组(64)
                byte[] keyByteArray = key.getEncoded();
                System.out.println("秘钥字节数组:" + Arrays.toString(keyByteArray));
                System.out.println("秘钥长度:" + keyByteArray.length);
                
                StringBuilder keyByteResult = new StringBuilder();
                for(byte b : keyByteArray) {
                    keyByteResult.append(String.format("%02x", b));
                }
                System.out.println(keyByteResult);
                
                
                //2.加密
                Mac mac = Mac.getInstance("HmacMD5");
                
                mac.init(key);
                
                //更新原始内容
                mac.update(passWord.getBytes());
                
                //加密
                byte[] resultByteArray = mac.doFinal();
                System.out.println("加密结果:" + resultByteArray.length + "字节");
                
                StringBuilder resultStr = new StringBuilder();
                for(byte b : resultByteArray) {
                    resultStr.append(String.format("%02x", b));
                }
                System.out.println("加密结果:" + resultStr);
                System.out.println("加密结果长度" + resultStr.length());
                
                
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            }
        }
     
    }
    ログイン後にコピー

    以上がJava 暗号化とセキュリティの例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

    Java の平方根のガイド。ここでは、Java で平方根がどのように機能するかを、例とそのコード実装をそれぞれ示して説明します。

    Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

    Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

    Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

    Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

    ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

    Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

    Javaのアームストロング数 Javaのアームストロング数 Aug 30, 2024 pm 04:26 PM

    Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

    Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

    Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

    Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

    この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

    Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

    Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

    See all articles