国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

PBKDF2算法Java實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了PBKDF2算法Java實(shí)現(xiàn)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

PBKDF2

輸入?yún)?shù)

輸出參數(shù)

Java實(shí)現(xiàn)

測試結(jié)果

使用隨機(jī)的salt

?使用固定的salt


PBKDF2

PBKDF2 (Password-Based?Key?Derivation?Function?2),基于口令的密鑰派生函數(shù),可以防止字典攻擊和彩虹表攻擊。使用用戶持有的、不需要保存的秘密,比如口令,來推導(dǎo)對稱密鑰(消息的發(fā)送方和接收方持有相同的秘密,使用同樣的算法來推導(dǎo)對稱密鑰)。

key = generateKey(String algorithm, char[] password, byte[] salt, int iterationCount, int keyLength)

輸入?yún)?shù)

algorithm: 算法名,比如:?PBKDF2WithHmacSHA256?

password: 口令,字節(jié)數(shù)組/字符串

salt:鹽,安全生成的隨機(jī)字節(jié),推薦長度為128位

iterationCount:迭代次數(shù)

keyLength:派生密鑰長度


注意:生成密鑰所使用的類為javax.crypto.SecretKeyFactory(私密密鑰工廠類)??梢酝ㄟ^指定以下的算法來請求SecretKeyFactory實(shí)例.

pbkdf2withhmacsha256,信息安全,密碼學(xué),java,安全,算法


輸出參數(shù)

根據(jù)請求長度派生的密鑰,如32字節(jié)(256位)的密鑰。

Java實(shí)現(xiàn)

import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;

public class PBKDF2Test {

    //字節(jié)數(shù)組轉(zhuǎn)換成十六進(jìn)制字符串
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

    public static byte[] generateKey(String algorithm, char[] password, byte[] salt, int iterationCount, int keyLength)
            throws NoSuchAlgorithmException, InvalidKeySpecException {
        KeySpec keySpec = new PBEKeySpec(password, salt, iterationCount, keyLength);
        SecretKeyFactory factory = SecretKeyFactory.getInstance(algorithm);
        byte[] key = factory.generateSecret(keySpec).getEncoded();
        return key;
    }

    public static void main(String[] args) {
        String algorithm = "PBKDF2WithHmacSHA256";
        SecureRandom sRandom = new SecureRandom();
        byte[] salt = new byte[16];
        sRandom.nextBytes(salt);
        String pwdText = "password1";
        int iterationCount = 50000;
        int keyLength = 256;
        try {
            byte[] hash = PBKDF2Test.generateKey(algorithm,password.toCharArray(), salt, iterationCount, keyLength);
            System.out.println("hash字節(jié)數(shù)組長度: " +hash.length);
            System.out.println("Hex字符串輸出: "+ bytesToHex(hash));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        }
    }
}

其中,algorithm使用的是PBKDF2WithHmacSHA256

String algorithm = "PBKDF2WithHmacSHA256";

salt是使用強(qiáng)隨機(jī)數(shù)生成器生成的長度為16的字節(jié)數(shù)組

SecureRandom sRandom = new SecureRandom();
byte[] salt = new byte[16];
sRandom.nextBytes(salt);

如果想基于指定的16進(jìn)制字符串來生成salt,需要使用 hexToByte(String hex) 函數(shù)來做轉(zhuǎn)換:

    public static byte[] hexToByte(String hex){
        int m = 0, n = 0;
        int byteLen = hex.length() / 2;
        byte[] ret = new byte[byteLen];
        for (int i = 0; i < byteLen; i++) {
            m = i * 2 + 1;
            n = m + 1;
            int intVal = Integer.decode("0x" + hex.substring(i * 2, m) + hex.substring(m, n));
            ret[i] = Byte.valueOf((byte)intVal);
        }
        return ret;
    }

?byte[] salt = hexToByte("aaef2d3f4d77ac66e9c5a6c3d8f921d1");

iterationCount,設(shè)置迭代次數(shù)為50000:

?int iterationCount = 50000;

?keyLength,設(shè)置派生密鑰長度為32字節(jié)/256位:

int keyLength = 256;

調(diào)用generateKey函數(shù),返回得到字節(jié)數(shù)組,并將其轉(zhuǎn)換成hex16進(jìn)制字符串:

bytesToHex(hash)

測試結(jié)果

使用隨機(jī)的salt

salt值是使用強(qiáng)隨機(jī)數(shù)生成器生成的,每次計(jì)算派生的密鑰是不一樣的。

第一次

pbkdf2withhmacsha256,信息安全,密碼學(xué),java,安全,算法

?第二次

pbkdf2withhmacsha256,信息安全,密碼學(xué),java,安全,算法

?使用固定的salt

salt值是基于hex字符串生成的,每次計(jì)算派生的密鑰是一樣的。

第一次和第二次

pbkdf2withhmacsha256,信息安全,密碼學(xué),java,安全,算法文章來源地址http://www.zghlxwxcb.cn/news/detail-611430.html

到了這里,關(guān)于PBKDF2算法Java實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【算法】Java實(shí)現(xiàn)RSA算法

    RSA(Rivest-Shamir-Adleman)是一種非對稱加密算法,它是目前最廣泛使用的公鑰加密算法之一。RSA算法是由三位密碼學(xué)家(Ron Rivest、Adi Shamir、Leonard Adleman)在1977年提出的。 RSA算法基于大數(shù)因子分解的數(shù)學(xué)難題,它使用一對密鑰:公鑰和私鑰。公鑰用于加密數(shù)據(jù),私鑰用于解密數(shù)

    2024年02月13日
    瀏覽(16)
  • 歸并排序算法(Java實(shí)現(xiàn))

    也稱 合并排序算法 ,是將兩個(gè)或兩個(gè)以上的有序數(shù)據(jù)序列合并成一個(gè)新的有序數(shù)據(jù)序列。該算法采用分治法(Divide and Conquer)的思想,將待排序的序列分成若干個(gè)子序列,分別對子序列進(jìn)行排序,然后將有序的子序列合并成一個(gè)大的有序序列 注:將幾個(gè)有序隊(duì)列合并成一個(gè)

    2024年01月17日
    瀏覽(22)
  • java實(shí)現(xiàn)二分查找算法

    遞歸實(shí)現(xiàn): public static int binarySearchRecursive(int[] arr, int target) { ? ? return binarySearchRecursive(arr, target, 0, arr.length - 1); } ? private static int binarySearchRecursive(int[] arr, int target, int low, int high) { ? ? if (low high) { ? ? ? ? return -1; // 沒有找到目標(biāo)元素 ? ? } ? ?? ? ? int mid = (low + high) / 2

    2024年04月09日
    瀏覽(18)
  • 十大排序算法(Java實(shí)現(xiàn))

    十大排序算法(Java實(shí)現(xiàn))

    復(fù)雜度和穩(wěn)定性表格一覽 排序算法 平均時(shí)間 最好時(shí)間 最壞時(shí)間 空間 穩(wěn)定性 冒泡 O ( n 2 ) O(n^2) O ( n 2 ) O ( n ) O(n) O ( n ) O ( n 2 ) O(n^2) O ( n 2 ) O ( 1 ) O(1) O ( 1 ) 穩(wěn)定 選擇 O ( n 2 ) O(n^2) O ( n 2 ) O ( n 2 ) O(n^2) O ( n 2 ) O ( n 2 ) O(n^2) O ( n 2 ) O ( 1 ) O(1) O ( 1 ) 不穩(wěn)定 插入 O ( n 2 ) O(n^2) O (

    2024年02月12日
    瀏覽(25)
  • KMP算法 Java實(shí)現(xiàn)

    Problem: 28. 找出字符串中第一個(gè)匹配項(xiàng)的下標(biāo) 目錄 解題方法 思路 構(gòu)建next數(shù)組 回溯查找 復(fù)雜度 Code 構(gòu)建next串 回溯查找next串,最后下標(biāo) 通過最大前綴后綴能找到下一次未查找到后要回溯的位置 無論如何第一個(gè)數(shù)的下一次回溯位置肯定是0,因此 next[0]=0 這里的 j 表示前綴起始位

    2024年04月17日
    瀏覽(18)
  • java實(shí)現(xiàn)排列組合算法

    我這里只寫了組合的算法。 ????????假設(shè)現(xiàn)有 M=4?個(gè)數(shù)據(jù) a,b,c,d。從中隨機(jī)抽取n個(gè)數(shù),n為1—4個(gè)數(shù)據(jù)進(jìn)行組合。那么數(shù)學(xué)中的計(jì)算組合方式為C(4,1) + C(4,2) + C(4,3) +?C(4,4)? = 4 + 6 + 4 + 1 = 15。那么共有15種組合方式。 方案一:此方法容易理解但是效率慢 ????????我的做

    2024年02月13日
    瀏覽(16)
  • Dijkstra算法實(shí)現(xiàn)(java)

    Dijkstra算法實(shí)現(xiàn)(java)

    ??Dijkstra(迪杰斯特拉)算法是求解單源最短路徑的經(jīng)典算法,其原理也是基于貪心策略的。 ??Dijkstra算法設(shè)置一個(gè)集合 S S S 記錄已求得的最短路徑的頂點(diǎn),初始時(shí)把源點(diǎn) v 0 v_{0} v 0 ? 放入 S S S ,集合 S S S 每并入一個(gè)新頂點(diǎn) v i v_{i} v i ? ,都要修改源點(diǎn) v 0 v_{0} v 0 ?

    2023年04月08日
    瀏覽(25)
  • Java實(shí)現(xiàn)常見查找算法

    Java實(shí)現(xiàn)常見查找算法

    查找是在大量的信息中尋找一個(gè)特定的信息元素,在計(jì)算機(jī)應(yīng)用中,查找是常用的基本運(yùn)算,例如編譯程序中符號表的查找。 線性查找(Linear Search)是一種簡單的查找算法,用于在數(shù)據(jù)集中逐一比較每個(gè)元素,直到找到目標(biāo)元素或搜索完整個(gè)數(shù)據(jù)集。它適用于任何類型的數(shù)

    2024年02月09日
    瀏覽(19)
  • LRU算法(JAVA實(shí)現(xiàn))

    LRU算法(JAVA實(shí)現(xiàn))

    最近最久未使用 (Least Recently Used? ? LRU)算法是?種緩存淘汰策略,它是大部分操作系統(tǒng)為 最大化頁面命中率 而廣泛采用的一種頁面置換算法。該算法的思路是,發(fā)生缺頁中斷時(shí),將最近一段時(shí)間內(nèi)最久未使用的頁面置換出去。 從程序運(yùn)行的原理來看,最近最久未使用算

    2024年02月10日
    瀏覽(26)
  • Java實(shí)現(xiàn)密碼加密實(shí)現(xiàn)步驟【bcrypt算法】

    在Spring Boot和SSM中實(shí)現(xiàn)密碼加密可以使用bcrypt算法。bcrypt是一種密碼哈希函數(shù),通過將密碼與隨機(jī)生成的鹽值進(jìn)行混合,然后再進(jìn)行多次迭代的計(jì)算,最終生成一個(gè)安全的哈希密碼。 下面是使用bcrypt算法實(shí)現(xiàn)密碼加密的步驟和代碼示例: 通過以上步驟,我們可以在Spring Boot和

    2024年02月11日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包