如何使用Java生成具有安全哈希的QR码
这是关于如何在Java中使用salt生成QR代码和安全散列字符串的分步教程。
首先,需要一个可以处理QR码的库,我决定使用ZebraCrossing(“ZXing”)库,因为它简单易用(即有围绕它的社区)。添加以下依赖项pom.xml:
com.google.zxing core 3.4.0 com.google.zxing javase 3.4.0
该库为生成和读取代码提供了相当广泛的功能。这对我的用例来说已经足够了,我只需要生成一个带有简单JSON对象的QR代码:
publicbyte[]qrCodeGenerator(Stringid)throwsIOException, WriterException, InvalidKeySpecException, NoSuchAlgorithmException{ StringfilePath="QRCode.png"; Stringcharset="UTF-8"; MaphintMap=newHashMap(); hintMap.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.L); MapqrCodeDataMap=Map.of( "Name",id, "Key",keyProvider.generateVerificationKey(id) //seenextsectionfor´generateVerificationKey´method ); StringjsonString=newJSONObject(qrCodeDataMap).toString(); createQRCode(jsonString,filePath,charset,hintMap,500,500); BufferedImageimage=ImageIO.read(newFile(filePath)); ByteArrayOutputStreambaos=newByteArrayOutputStream(); ImageIO.write(image,"png",baos); byte[]imageData=baos.toByteArray(); returnimageData; } privatevoidcreateQRCode(StringqrCodeData, StringfilePath, Stringcharset, MaphintMap, intqrCodeHeight, intqrCodeWidth)throwsWriterException, IOException{ BitMatrixmatrix=newMultiFormatWriter().encode( newString(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:
MapqrCodeDataMap=Map.of( "Name","SampleText", "Key","SomeHashedValue" );
StringjsonString=newJSONObject(qrCodeDataMap).toString();
为了能够使用JSONObject类,您需要将以下依赖项添加到您的pom.xml:
org.json json 20180813
如果您正在寻找更简化的接口,您可能还会查看QRGen,它声称可以进一步简化用于Java的QR代码生成API,并且构建在ZXing之上。但是,在我的情况下,ZXing绝对没问题。
哈希字符串
现在,我需要能够以快速安全的方式哈希加密字符串。为此,我决定使用OWASPforJava建议的方法。要实现此方法,您需要首先更新pom.xml:
commons-codec commons-codec 1.12
这里是Java中所述方法的(有些简化)实现:
publicStringgenerateVerificationKey(Stringstr)throwsNoSuchAlgorithmException, InvalidKeySpecException{ intiterations=10000; intkeyLength=512; char[]strChars=str.toCharArray(); byte[]saltBytes=salt.getBytes(); SecretKeyFactoryskf=SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512"); PBEKeySpecspec=newPBEKeySpec(strChars,saltBytes,iterations,keyLength); SecretKeykey=skf.generateSecret(spec); byte[]hashedBytes=key.getEncoded(); returnHex.encodeHexString(hashedBytes); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。