java生成隨機iv,java生成隨機int

本文目錄一覽:

java 求助

public abstract class Vehicle {

public int wheelNum = 4;//輪子數量

public abstract void getCharge();//計算收費的抽象方法

public abstract void getWheeiNum(int wheelNum);//得到輪子數的方

}

public class Taxi extends Vehicle{

private double qibujia;//起步價

private double danjia;//單價

private double lucheng;//里程數

public double getQibujia() {

return qibujia;

}

public void setQibujia(double qibujia) {

this.qibujia = qibujia;

}

public double getDanjia() {

return danjia;

}

public void setDanjia(double danjia) {

this.danjia = danjia;

}

public double getLucheng() {

return lucheng;

}

public void setLucheng(double lucheng) {

this.lucheng = lucheng;

}

@Override

public void getCharge() {

// TODO Auto-generated method stub

double shoufei = qibujia+(lucheng – 3.0)* danjia;

System.out.println(“的士的收費為:”+shoufei);

}

@Override

public void getWheeiNum(int wheelNum) {

this.wheelNum = wheelNum;

System.out.println(“的士的輪子有”+wheelNum+”個”);

}

}

public class Pedicab extends Vehicle{

public Pedicab(int wheelNum){

this.wheelNum = 3;

}

@Override

public void getCharge() {

double shoufei = 3;

System.out.println(“三輪車的收費為:”+shoufei);

}

@Override

public void getWheeiNum(int wheelNum) {

System.out.println(“三輪車的輪子有”+wheelNum+”個”);

}

}

public class Test {

public static void main(String[] args) {

Taxi t = new Taxi();

//創建一個的士類的對象,並為各個屬性賦初值

t.setQibujia(5.0);

t.setDanjia(3.0);

t.setLucheng(8.0);

//創建一個三輪車類的對象,調用該類的構造將輪子數初始化

Pedicab p = new Pedicab(3);

//調用的士類的相應方法,輸出收費和輪子數

t.getCharge();

t.getWheeiNum(4);

//調用三輪車類相應方法,輸出三輪車對象的收費和輪子數

p.getCharge();

p.getWheeiNum(3);

}

}

密碼那些事

之前在工作中經常用密鑰,但是不知道其中的原因,現在閑下來就來看下,再看的過程發現這個隨機數概念很模糊,於是就查了下,現總結如下:

 0x01 隨機數

概述

隨機數在計算機應用中使用的比較廣泛,最為熟知的便是在密碼學中的應用。本文主要是講解隨機數使用導致的一些Web安全風。

我們先簡單了解一下隨機數

分類

隨機數分為真隨機數和偽隨機數,我們程序使用的基本都是偽隨機數,其中偽隨機又分為強偽隨機數和弱偽隨機數。

真隨機數,通過物理實驗得出,比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等

偽隨機數,通過一定算法和種子得出。軟件實現的是偽隨機數

強偽隨機數,難以預測的隨機數

弱偽隨機數,易於預測的隨機數

特性

隨機數有3個特性,具體如下:

隨機性:不存在統計學偏差,是完全雜亂的數列

不可預測性:不能從過去的數列推測出下一個出現的數

不可重現性:除非將數列本身保存下來,否則不能重現相同的數列

隨機數的特性和隨機數的分類有一定的關係,比如,弱偽隨機數只需要滿足隨機性即可,而強位隨機數需要滿足隨機性和不可預測性,真隨機數則需要同時滿足3個特性。

引發安全問題的關鍵點在於不可預測性。

偽隨機數的生成

我們平常軟件和應用實現的都是偽隨機數,所以本文的重點也就是偽隨機數。

偽隨機數的生成實現一般是算法+種子。

具體的偽隨機數生成器PRNG一般有:

線性同餘法

單向散列函數法

密碼法

ANSI X9.17

比較常用的一般是線性同餘法,比如我們熟知的C語言的rand庫和Java的java.util.Random類,都採用了線性同餘法生成隨機數。

應用場景

隨機數的應用場景比較廣泛,以下是隨機數常見的應用場景:

驗證碼生成

抽獎活動

UUID生成

SessionID生成

Token生成

CSRF Token

找回密碼Token

游 戲 (隨機元素的生成)

洗牌

俄羅斯方塊出現特定形狀的序列

遊戲爆裝備

密碼應用場景

生成密鑰:對稱密碼,消息認證

生成密鑰對:公鑰密碼,數字簽名

生成IV: 用於分組密碼的CBC,CFB和OFB模式

生成nonce: 用於防禦重放攻擊; 分組密碼的CTR模式

生成鹽:用於基於口令的密碼PBE等

0x02 隨機數的安全性

相比其他密碼技術,隨機數很少受到關注,但隨機數在密碼技術和計算機應用中是非常重要的,不正確的使用隨機數會導致一系列的安全問題。

隨機數的安全風險

隨機數導致的安全問題一般有兩種

應該使用隨機數,開發者並沒有使用隨機數;

應該使用強偽隨機數,開發者使用了弱偽隨機數。

第一種情況,簡單來講,就是我們需要一個隨機數,但是開發者沒有使用隨機數,而是指定了一個常量。當然,很多人會義憤填膺的說,sb才會不用隨機數。但是,請不要忽略我朝還是有很多的。主要有兩個場景:

開發者缺乏基礎常識不知道要用隨機數;

一些應用場景和框架,接口文檔不完善或者開發者沒有仔細閱讀等原因。

比如找回密碼的token,需要一個偽隨機數,很多業務直接根據用戶名生成token;

比如OAuth2.0中需要第三方傳遞一個state參數作為CSRF Token防止CSRF攻擊,很多開發者根本不使用這個參數,或者是傳入一個固定的值。由於認證方無法對這個值進行業務層面有效性的校驗,導致了 OAuth 的CSRF攻擊。

第二種情況,主要區別就在於偽隨機數的強弱了,大部分(所有?)語言的API文檔中的基礎庫(常用庫)中的random庫都是弱偽隨機,很多開發自然就直接使用。但是,最重要也最致命的是,弱偽隨機數是不能用於密碼技術的。

還是第一種情況中的找回密碼場景,關於token的生成, 很多開發使用了時間戳作為隨機數(md5(時間戳),md5(時間戳+用戶名)),但是由於時間戳是可以預測的,很容易就被猜解。不可預測性是區分弱偽隨機數和強偽隨機數的關鍵指標。

當然,除了以上兩種情況,還有一些比較特別的情況,通常情況下比較少見,但是也不排除:

種子的泄露,算法很多時候是公開的,如果種子泄露了,相當於隨機數已經泄露了;

隨機數池不足。這個嚴格來說也屬於弱偽隨機數,因為隨機數池不足其實也導致了隨機數是可預測的,攻擊者可以直接暴力破解。

漏洞實例

wooyun上有很多漏洞,還蠻有意思的,都是和隨機數有關的。

1.應該使用隨機數而未使用隨機數

Oauth2.0的這個問題特別經典,除了wooyun實例列出來的,其實很多廠商都有這個問題。

Oauth2.0中state參數要求第三方應用的開發者傳入一個CSRF Token(隨機數),如果沒有傳入或者傳入的不是隨機數,會導致CSRF登陸任意帳號:

唯品會賬號相關漏洞可通過csrf登錄任意賬號

人人網 – 百度 OAuth 2.0 redirect_uir CSRF 漏洞

2.使用弱偽隨機數

1) 密碼取回

很多密碼找回的場景,會發 送給 用戶郵件一個url,中間包含一個token,這個token如果猜測,那麼就可以找回其他用戶的密碼。

1. Shopex  4.8.5密碼取回處新生成密碼可預測漏洞

直接使用了時間函數microtime()作為隨機數,然後獲取MD5的前6位。

1. substr(md5(print_r(microtime(),true)),0,6);

PHP 中microtime()的值除了當前 服務器 的秒數外,還有微秒數,微妙數的變化範圍在0.000000 — 0.999999 之間,一般來說,服務器的時間可以通過HTTP返回頭的DATE字段來獲取,因此我們只需要遍歷這1000000可能值即可。但我們要使用暴力破解的方式發起1000000次請求的話,網絡請求數也會非常之大。可是shopex非常貼心的在生成密碼前再次將microtime() 輸出了一次:

1. $messenger = $this-system-loadModel(‘system/messenger’);echo microtime().”

“;

2.奇虎360任意用戶密碼修改

直接是MD5( unix 時間戳)

3.塗鴉王國弱隨機數導致任意用戶劫持漏洞,附測試POC

關於找回密碼隨機數的問題強烈建議大家參考拓哥的11年的文章《利用系統時間可預測破解java隨機數| 空虛浪子心的靈魂》

2) 其他隨機數驗證場景

CmsEasy最新版暴力注入(加解密缺陷/繞過防注入)

弱偽隨機數被繞過

Espcms v5.6 暴力注入

Espcms中一處SQL注入漏洞的利用,利用時發現espcms對傳值有加密並且隨機key,但是這是一個隨機數池固定的弱偽隨機數,可以被攻擊者遍歷繞過

Destoon B2B  2014-05-21最新版繞過全局防禦暴力注入(官方Demo可重現)

使用了microtime()作為隨機數,可以被預測暴力破解

Android  4.4之前版本的Java加密架構(JCA)中使用的Apache Harmony 6.0M3及其之前版本的SecureRandom實現存在安全漏洞,具體位於classlib/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/SHA1PRNG_SecureRandomImpl.java

類的engineNextBytes函數里,當用戶沒有提供用於產生隨機數的種子時,程序不能正確調整偏移量,導致PRNG生成隨機序列的過程可被預測。

Android SecureRandom漏洞詳解

安全建議

上面講的隨機數基礎和漏洞實例更偏重是給攻擊者一些思路,這裡更多的是一些防禦和預防的建議。

業務場景需要使用隨機數,一定要使用隨機數,比如Token的生成;

隨機數要足夠長,避免暴力破解;

保證不同用處的隨機數使用不同的種子

對安全性要求高的隨機數(如密碼技術相關)禁止使用的弱偽隨機數:

不要使用時間函數作為隨機數(很多程序員喜歡用時間戳) Java:system.currenttimemillis() php:microtime()

不要使用弱偽隨機數生成器 Java: java.util.Random PHP: rand() 範圍很小,32767 PHP: mt_rand() 存在缺陷

強偽隨機數CSPRNG(安全可靠的偽隨機數生成器(Cryptographically Secure  Pseudo-Random Number Generator)的各種參考

6.強偽隨機數生成(不建議開發自己實現)

產生高強度的隨機數,有兩個重要的因素:種子和算法。算法是可以有很多的,通常如何選擇種子是非常關鍵的因素。 如Random,它的種子是System.currentTimeMillis(),所以它的隨機數都是可預測的, 是弱偽隨機數。

強偽隨機數的生成思路:收集計算機的各種,鍵盤輸入時間,內存使用狀態,硬盤空閑空間,IO延時,進程數量,線程數量等信息,CPU時鐘,來得到一個近似隨機的種子,主要是達到不可預測性。

暫時先寫到這裡

java要怎麼實現zeropadding的des解密

package com.va.util;

import com.zoki.util.Charset;

import java.security.InvalidAlgorithmParameterException;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import java.security.spec.InvalidKeySpecException;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.crypto.BadPaddingException;

import javax.crypto.spec.DESKeySpec;

import javax.crypto.SecretKeyFactory;

import javax.crypto.SecretKey;

import javax.crypto.Cipher;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.spec.IvParameterSpec;

/**

 * 注意:DES加密和解密過程中,密鑰長度都必須是8的倍數。br

 * 當默認用DES,JAVA會用ECB模式,因此這裡IV向量沒有作用,這裡,但當用CBC模式下,如果還是用SecureRandom,

 * 則每次加密的結果都會不一樣,因為JAVA內部會用隨機的IV來初始化Cipher對象,如示例代碼,

 * 由於Cipher.getInstance(“DES/CBC/PKCS5Padding”)使用了CBC,

 * 因此我這裡用的javax.crypto.spec.IvParameterSpec包下的IvParameterSpec來初始化向量IVbr

 * JAVA中默認的算法為ECB,默認填充方式為PKCS5Padding

 */

public class DES {

    private DES() {

    }

    /**

     * 加密

     *

     * @param src byte[] 加密的數據源

     * @param password byte[] 加密秘鑰

     * @return byte[] 加密後的數據

     */

    public static byte[] encrypt(byte[] src, byte[] password) {

        try {

            DESKeySpec desKey = new DESKeySpec(password);

            //創建一個密匙工廠,然後用它把DESKeySpec轉換成

            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(“DES”);

            SecretKey securekey = keyFactory.generateSecret(desKey);

            //Cipher對象實際完成加密操作

            Cipher cipher = Cipher.getInstance(“DES/CBC/PKCS5Padding”);

            //ECB模式下,iv不需要

            IvParameterSpec iv = new IvParameterSpec(password);

            //用密匙初始化Cipher對象

            cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);

            //現在,獲取數據並加密

            //正式執行加密操作

            return cipher.doFinal(src);

        } catch (InvalidKeyException | NoSuchAlgorithmException | InvalidKeySpecException | NoSuchPaddingException | IllegalBlockSizeException | BadPaddingException | InvalidAlgorithmParameterException ex) {

            Logger.getLogger(DES.class.getName()).log(Level.SEVERE, null, ex);

        }

        return null;

    }

    /**

     * 加密

     *

     * @param src byte[] 加密的數據源

     * @param password String 加密秘鑰

     * @return byte[] 加密後的數據

     */

    public static byte[] encrypt(byte[] src, String password) {

        byte[] keyBytes = password.getBytes(Charset.utf8);

        return encrypt(src, keyBytes);

    }

    /**

     * 解密

     *

     * @param src byte[] 解密的數據源

     * @param password byte[] 解密秘鑰

     * @return byte[] 解密後的數據

     */

    public static byte[] decrypt(byte[] src, byte[] password) {

        try {

            // DES算法要求有一個可信任的隨機數源

            //SecureRandom random = new SecureRandom();

            // 創建一個DESKeySpec對象

            DESKeySpec desKey = new DESKeySpec(password);

            // 創建一個密匙工廠

            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(“DES”);

            // 將DESKeySpec對象轉換成SecretKey對象

            SecretKey securekey = keyFactory.generateSecret(desKey);

            // Cipher對象實際完成解密操作,CBC為加密模式,

            Cipher cipher = Cipher.getInstance(“DES/CBC/PKCS5Padding”);

            //ECB模式下,iv不需要

            IvParameterSpec iv = new IvParameterSpec(password);

            // 用密匙初始化Cipher對象

            cipher.init(Cipher.DECRYPT_MODE, securekey, iv);

            // 真正開始解密操作

            return cipher.doFinal(src);

        } catch (InvalidKeyException | NoSuchAlgorithmException | InvalidKeySpecException | NoSuchPaddingException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException ex) {

            Logger.getLogger(DES.class.getName()).log(Level.SEVERE, null, ex);

        }

        return null;

    }

    /**

     * 解密

     *

     * @param src byte[] 解密的數據源

     * @param password String 解密秘鑰

     * @return byte[] 解密後的數據

     */

    public static byte[] decrypt(byte[] src, String password) {

        byte[] keyBytes = password.getBytes(Charset.utf8);

        return decrypt(src, keyBytes);

    }

}

java將int型變量iV的最高位元組傳送到byte型變量bV的程序片段

 public static byte[] int2bytes(int s) {

  if (s  0xFFFF) throw new LogicException(“數字太大無法轉換”);

  byte[] rtn = new byte[2];

  rtn[0] = (byte) ((0xFF00  s)  8);

  rtn[1] = (byte) (0x00FF  s);

  return rtn;

 }

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/248185.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:25
下一篇 2024-12-12 13:25

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論