検索
ホームページJava&#&チュートリアル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 までご連絡ください。
    Javaのプラットフォームの独立性を脅かしたり強化したりする新しいテクノロジーはありますか?Javaのプラットフォームの独立性を脅かしたり強化したりする新しいテクノロジーはありますか?Apr 24, 2025 am 12:11 AM

    新しいテクノロジーは、両方の脅威をもたらし、Javaのプラットフォームの独立性を高めます。 1)Dockerなどのクラウドコンピューティングとコンテナ化テクノロジーは、Javaのプラットフォームの独立性を強化しますが、さまざまなクラウド環境に適応するために最適化する必要があります。 2)WebAssemblyは、Graalvmを介してJavaコードをコンパイルし、プラットフォームの独立性を拡張しますが、パフォーマンスのために他の言語と競合する必要があります。

    JVMのさまざまな実装は何ですか、そしてそれらはすべて同じレベルのプラットフォームの独立性を提供しますか?JVMのさまざまな実装は何ですか、そしてそれらはすべて同じレベルのプラットフォームの独立性を提供しますか?Apr 24, 2025 am 12:10 AM

    JVMの実装が異なると、プラットフォームの独立性が得られますが、パフォーマンスはわずかに異なります。 1。OracleHotspotとOpenJDKJVMは、プラットフォームの独立性で同様に機能しますが、OpenJDKは追加の構成が必要になる場合があります。 2。IBMJ9JVMは、特定のオペレーティングシステムで最適化を実行します。 3. Graalvmは複数の言語をサポートし、追加の構成が必要です。 4。AzulzingJVMには、特定のプラットフォーム調整が必要です。

    プラットフォームの独立性は、開発コストと時間をどのように削減しますか?プラットフォームの独立性は、開発コストと時間をどのように削減しますか?Apr 24, 2025 am 12:08 AM

    プラットフォームの独立性により、開発コストが削減され、複数のオペレーティングシステムで同じコードセットを実行することで開発時間を短縮します。具体的には、次のように表示されます。1。開発時間を短縮すると、1セットのコードのみが必要です。 2。メンテナンスコストを削減し、テストプロセスを統合します。 3.展開プロセスを簡素化するための迅速な反復とチームコラボレーション。

    Javaのプラットフォームの独立性は、コードの再利用をどのように促進しますか?Javaのプラットフォームの独立性は、コードの再利用をどのように促進しますか?Apr 24, 2025 am 12:05 AM

    java'splatformentedencefacilitatesecodereusebyAllowingbyTeCodeCodeCodeCodeTorunonAnyPlatformm.1)DevelopersConcodeCodeOnceOnceOnconconsentEntentEntEntEntEntEntentPlatforms.2)維持化されたアスカデドは、NoeedReadedoesではありません

    Javaアプリケーションのプラットフォーム固有の問題をどのようにトラブルシューティングしますか?Javaアプリケーションのプラットフォーム固有の問題をどのようにトラブルシューティングしますか?Apr 24, 2025 am 12:04 AM

    Javaアプリケーションのプラットフォーム固有の問題を解決するには、次の手順を実行できます。1。Javaのシステムクラスを使用して、システムプロパティを表示して実行中の環境を理解します。 2。ファイルクラスまたはjava.nio.fileパッケージを使用して、ファイルパスを処理します。 3。オペレーティングシステムの条件に応じてローカルライブラリをロードします。 4. VisualVMまたはJProfilerを使用して、クロスプラットフォームのパフォーマンスを最適化します。 5.テスト環境が、Dockerコンテナ化を通じて生産環境と一致していることを確認してください。 6. githubactionsを使用して、複数のプラットフォームで自動テストを実行します。これらの方法は、Javaアプリケーションでプラットフォーム固有の問題を効果的に解決するのに役立ちます。

    JVMのクラスローダーサブシステムは、プラットフォームの独立性にどのように貢献していますか?JVMのクラスローダーサブシステムは、プラットフォームの独立性にどのように貢献していますか?Apr 23, 2025 am 12:14 AM

    クラスローダーは、統一されたクラスファイル形式、動的読み込み、親代表団モデル、プラットフォーム非依存バイトコードを通じて、さまざまなプラットフォーム上のJavaプログラムの一貫性と互換性を保証し、プラットフォームの独立性を実現します。

    Javaコンパイラはプラットフォーム固有のコードを作成しますか?説明する。Javaコンパイラはプラットフォーム固有のコードを作成しますか?説明する。Apr 23, 2025 am 12:09 AM

    Javaコンパイラによって生成されたコードはプラットフォームに依存しませんが、最終的に実行されるコードはプラットフォーム固有です。 1。Javaソースコードは、プラットフォームに依存しないバイトコードにコンパイルされます。 2。JVMは、特定のプラットフォームのバイトコードをマシンコードに変換し、クロスプラットフォーム操作を保証しますが、パフォーマンスは異なる場合があります。

    JVMは、さまざまなオペレーティングシステムでマルチスレッドをどのように処理しますか?JVMは、さまざまなオペレーティングシステムでマルチスレッドをどのように処理しますか?Apr 23, 2025 am 12:07 AM

    マルチスレッドは、プログラムの応答性とリソースの利用を改善し、複雑な同時タスクを処理できるため、最新のプログラミングで重要です。 JVMは、スレッドマッピング、スケジューリングメカニズム、同期ロックメカニズムを介して、異なるオペレーティングシステム上のマルチスレッドの一貫性と効率を保証します。

    See all articles

    ホット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衣類リムーバー

    Video Face Swap

    Video Face Swap

    完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

    ホットツール

    VSCode Windows 64 ビットのダウンロード

    VSCode Windows 64 ビットのダウンロード

    Microsoft によって発売された無料で強力な IDE エディター

    ZendStudio 13.5.1 Mac

    ZendStudio 13.5.1 Mac

    強力な PHP 統合開発環境

    MantisBT

    MantisBT

    Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

    メモ帳++7.3.1

    メモ帳++7.3.1

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

    mPDF

    mPDF

    mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。