如何使用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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。