使用Java生成具有安全雜湊的QR碼 | Rustam Mehmandarov
這是關於如何在Java中使用salt生成QR程式碼和安全雜湊字串的分步教程。
首先,需要一個可以處理QR碼的庫,我決定使用Zebra Crossing(“ZXing”)庫,因為它簡單易用(即有圍繞它的社群)。新增以下依賴項pom.xml:
<dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.4.0</version> </dependency> |
該庫為生成和讀取程式碼提供了相當廣泛的功能。這對我的用例來說已經足夠了,我只需要生成一個帶有簡單JSON物件的QR程式碼:
public byte[] qrCodeGenerator(String id) throws IOException, WriterException, InvalidKeySpecException, NoSuchAlgorithmException { String filePath = "QRCode.png"; String charset = "UTF-8"; Map hintMap = new HashMap(); hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); Map<String, String> qrCodeDataMap = Map.of( "Name", id, "Key", keyProvider.generateVerificationKey(id) // see next section for ´generateVerificationKey´ method ); String jsonString = new JSONObject(qrCodeDataMap).toString(); createQRCode(jsonString, filePath, charset, hintMap, 500, 500); BufferedImage image = ImageIO.read(new File(filePath)); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(image, "png", baos); byte[] imageData = baos.toByteArray(); return imageData; } private void createQRCode(String qrCodeData, String filePath, String charset, Map hintMap, int qrCodeHeight, int qrCodeWidth) throws WriterException, IOException { BitMatrix matrix = new MultiFormatWriter().encode( new String(qrCodeData.getBytes(charset), charset), BarcodeFormat.QR_CODE, qrCodeWidth, qrCodeHeight, hintMap ); MatrixToImageWriter.writeToPath( matrix, filePath.substring(filePath.lastIndexOf('.') + 1), FileSystems.getDefault().getPath(filePath) ); } |
還要注意有趣的小東西 JSONObject:是使用Java將雜湊對映轉換為JSON物件。有時,以您希望的方式構建資料結構要容易得多,然後序列化為JSON:
Map<String, String> qrCodeDataMap = Map.of( "Name", "SampleText", "Key", "SomeHashedValue" ); String jsonString = new JSONObject(qrCodeDataMap).toString(); |
為了能夠使用JSONObject類,您需要將以下依賴項新增到您的pom.xml:
<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20180813</version> </dependency> |
如果您正在尋找更簡化的介面,您可能還會檢視QRGen,它聲稱可以進一步簡化用於Java的QR程式碼生成API,並且構建在ZXing之上。但是,在我的情況下,ZXing絕對沒問題。
雜湊字串
現在,我需要能夠以快速安全的方式雜湊加密字串。為此,我決定使用OWASP for Java建議的方法。要實現此方法,您需要首先更新pom.xml:
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.12</version> </dependency> |
這裡是Java中所述方法的(有些簡化)實現:
public String generateVerificationKey(String str) throws NoSuchAlgorithmException, InvalidKeySpecException { int iterations = 10000; int keyLength = 512; char[] strChars = str.toCharArray(); byte[] saltBytes = salt.getBytes(); SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512"); PBEKeySpec spec = new PBEKeySpec(strChars, saltBytes, iterations, keyLength); SecretKey key = skf.generateSecret( spec ); byte[] hashedBytes = key.getEncoded( ); return Hex.encodeHexString(hashedBytes); } |
相關文章
- 安全的雜湊
- 使用ABAP程式碼生成二維碼(QR Code)
- java 雜湊表和執行緒安全Java執行緒
- 雜湊表的程式碼實現(Java)Java
- 使用 Python 生成二維條形碼 QR CodesPython
- 用ABAP 生成二維碼 QR Code
- js 雜湊雜湊值的模組JS
- 使用 password_hash 來雜湊密碼密碼
- JAVA 實現 - 雜湊表Java
- 深入理解雜湊表(JAVA和Redis雜湊表實現)JavaRedis
- 加鹽密碼雜湊:如何正確使用密碼
- mysql中雜湊索引的使用限制MySql索引
- Fortran雜湊函式庫的使用函式
- 雜湊表(雜湊表)詳解
- 雜湊遊戲原始碼開發搭建丨hash雜湊遊戲競猜原始碼搭建丨雜湊遊戲系統開發遊戲原始碼
- Java集合原始碼分析之基礎(二):雜湊表Java原始碼
- Android facebook KeyHash生成(生成釋出金鑰雜湊)Android
- 雜湊
- HASH雜湊遊戲原始碼丨HASH雜湊遊戲系統開發丨HASH雜湊遊戲開發成品原始碼部署原始碼遊戲開發
- 雜湊表(雜湊表)原理詳解
- 【尋跡#3】 雜湊與雜湊表
- 雜湊競猜開發原理丨雜湊競猜遊戲原始碼丨雜湊競猜系統開發設計程式碼遊戲原始碼
- 使用ABAP建立QR Code(二維碼)
- 使用雜湊加鹽法來為密碼加密【轉】密碼加密
- Hasher for Mac(雜湊值生成器)v1.4Mac
- Hash雜湊遊戲原始碼丨雜湊競猜遊戲系統技術開發丨Hash雜湊遊戲講解遊戲原始碼
- 查詢(3)--雜湊表(雜湊查詢)
- 幾道和雜湊(雜湊)表有關的面試題面試題
- 雜湊遊戲之雜湊盒子的趨勢未來可期遊戲
- 程式碼安全測試第四期:可逆的單向雜湊漏洞
- 雜湊表的原理
- 樹雜湊
- 雜湊碰撞
- 字串雜湊字串
- 雜湊表
- 從Dictionary原始碼看雜湊表原始碼
- JAVA資料結構之雜湊表Java資料結構
- 【六褘-Java】雜湊演算法記憶體圖;set集合低層採用雜湊表儲存元素;雜湊演算法的流程Java演算法記憶體