欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用Java生成具有安全哈希的QR码

程序员文章站 2022-07-11 17:15:22
这是关于如何在Java中使用salt生成QR代码和安全散列字符串的分步教程。 首先,需要一个可以处理QR码的库,我决定使用Zebra Crossing(“ZXing”)库,因为它简单易用(即有围绕它的社区)。添加以下依赖项pom.xml: 该库为生成和读取代码提供了相当广泛的功能。这对我的用例来说已 ......

这是关于如何在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);
}

使用Java生成具有安全哈希的QR码