In jüngster Zeit wurden auf vielen Websites nach und nach populär. Einerseits ist es für Benutzererfahrungen relativ neu und einfach zu bedienen. Andererseits wurde die Sicherheit im Vergleich zu den grafischen Überprüfungscodes nicht stark reduziert. Natürlich gibt es bisher keine absolute Sicherheitsüberprüfung, aber es erhöht nur die Kosten für den Bypass für Angreifer.
Analysieren Sie als Nächstes den Kernprozess des Verifizierungscodes für den Schieber:
Erzeugt zufällig Ausschnitte und Hintergrundbilder mit Ausschnittschatten im Backend und speichert zufällige Ausschnittspositionskoordinaten im Hintergrund.
Das Front-End erkennt, dass gleitende Interaktion auf den Ausschnittschatten geschaltet wird und den Schieber entfernt des Benutzers wie das folgende Beispiel erhält, wie das folgende Beispiel
Das Front-End übergibt den Einladungswert des Benutzers in das Back-End, und der Back-End überprüft, ob sich der Fehler innerhalb des zulässigen Bereichs befindet.
Hier ist es die grundlegendste Überprüfung, einfach zu überprüfen, ob die Gleitdistanz des Benutzers die grundlegendste Überprüfung ist. Aus höheren Sicherheitsgründen kann auch die gesamte Flugbahn des Siebs des Benutzers, das Zugriffsverhalten des Benutzers auf der aktuellen Seite usw. berücksichtigt werden. Diese können komplex sein, und selbst mit Hilfe von Modellen für die Analyse von Benutzerverhaltensdaten ist das ultimative Ziel, die Schwierigkeit der illegalen Simulation und Umgehung zu erhöhen. Dies sind die Möglichkeiten, die häufig verwendete Methoden zusammengefasst und zusammengefasst werden können. Dieser Artikel konzentriert sich darauf, wie die Verifizierungscodes für die Verifizierung von Schiebern Schritt für Schritt basierend auf Java erzeugt werden.
Es ist ersichtlich, dass der Schiebergrafikverifizierungscode aus zwei wichtigen Bildern besteht, dem Blockschnitt und dem Originalbild mit dem Blockschneidungsschatten. Hier gibt es zwei wichtige Merkmale, um die Schwierigkeit zu gewährleisten, brutal erzwungen zu werden: Die Form des Blockschnitts und die Position des Originalbildes, in dem sich der Block befindet, ist zufällig. Dies ermöglicht es, dass zufällige, unregelmäßig gefundene Paarungen von Ausschnitten und Originalbildern in einem begrenzten Satz von Bildern erstellt werden.
Wie kann ich Code verwenden, um ein kleines Bild mit einer bestimmten zufälligen Form aus einem großen Bild zu extrahieren?
Der erste Schritt besteht darin, den Umriss des Ausschnittsbildes zu bestimmen, um die tatsächliche Ausführung des Bildverarbeitungsvorgangs in Zukunft zu erleichtern.
Das Bild besteht aus Pixeln, und jeder Pixelpunkt entspricht einer Farbe. Die Farbe kann in RGB-Form sowie einer Transparenz dargestellt werden und ein Bild als Ebene mit der oberen linken Ecke als Ursprung, zur rechten x-Achse und an der Abwärts-Y-Achse und der y-Achse und einer Koordinatenwert der Farbe des Pixelpunkts an der entsprechenden Position entspricht, so dass ein Bild in ein Zwei-Dimema-Array konvertiert werden kann. Basierend auf dieser Überlegung wird der Umriss auch durch ein zweidimensionales Array dargestellt, wobei der Elementwert innerhalb der Überlinie 1 und der Elementwert außerhalb der Umriss 0 beträgt.
Zu diesem Zeitpunkt müssen Sie darüber nachdenken, wie Sie diese Umrissform erzeugen können. Es gibt Koordinatensysteme, Rechtecke und Kreise. Ja, mathematische grafische Funktionen werden verwendet. Typischerweise Funktionen mit der Funktionsgleichung eines Kreises und der Seitenlinienfunktion eines Rechtecks, ähnlich wie folgt:
In (xa) ²+(yb) ² = R² gibt es drei Parameter A, B und R, dh die mittlere Koordinate ist (a, b) und der Radius r. Diese Ausschnitte werden auf das oben beschriebene Koordinatensystem platziert und es ist einfach, die spezifischen Werte aus dem Diagramm zu berechnen.
Der Beispielcode lautet wie folgt:
private int [] [] getBlockData () {int [] [] data = new int [targetLength] [targetWidth]; doppelte x2 = targetLength-circler-2; // Die Position des zufällig erzeugten Kreises Double H1 = Circler + Math.Random () * (Zielwidth-3 * Circler-R1); double po = circler*circler; double xbegin = targetLength-circler-r1; Double yBegin = Zielwidth-Circler-R1; für (int i = 0; i <targetLength; i ++) {für (int j = 0; j <targetWidth; j ++) {// rechts ○ Double d3 = math.pow (i - x2,2)+math.pow (j - h1,2); if (d1 <= po || (j> = yBegin && d2> = po) || (i> = xbegin && d3> = po)) {data [i] [j] = 0; } else {data [i] [j] = 1; }}} Daten zurückgeben; }Der zweite Schritt ist, dass Sie nach diesem Umriss den Ausschnitt basierend auf dem Wert dieses zweidimensionalen Arrays bestimmen und der Ausschnittsposition auf dem Originalbild einen Schatten hinzufügen können.
Die Operation ist wie folgt:
private void cutByTemplate (bufferedimage oriimage, bufferedimage targetImage, int [] [] templateImage, int x, int y) {für (int i = 0; i <targetLength; i ++) {für (int j = 0; j <targetwidth; // der Farbverfärbungsvorgang in der entsprechenden Position im Originalbild int rgb_ori = oriimage.getRGB (x + i, y + j); if (rgb == 1) {// Kopieren Sie den entsprechenden Farbwert auf dem Ausschnittsbild targetImage.setrgb (i, y + j, rgb_ori); int r = (0xff & rgb_ori); int g = (0xff & (rgb_ori >> 8)); int b = (0xff & (rgb_ori >> 16))); rgb_ori = r + (g << 8) + (b << 16) + (200 << 24); // Die Farbänderung der entsprechenden Position des Originalbildes oriimage.setRGB (x + i, y + j, rgb_ori); }}}}Nach den ersten beiden Schritten erhalten Sie den Ausschnitt und das Originalbild mit Ausschnittschatten. Um die Verwirrung zu erhöhen und die Netzwerkbelastungseffekt zu verbessern, ist auch eine weitere Verarbeitung von Bildern erforderlich. Im Allgemeinen gibt es zwei Dinge zu tun. Einer besteht darin, das Bild zu verwischen und die Schwierigkeit der Maschinenerkennung zu erhöhen, und das andere ist, eine angemessene Komprimierung derselben Qualität durchzuführen. Fuzzy -Verarbeitung ist leicht an Gaußsche Unschärfe zu denken, und das Prinzip ist leicht zu verstehen. Sie können nach Google gehen, um darüber zu erfahren. Insbesondere für die Java -Implementierung gibt es viele Versionen. Jetzt gibt es keine Gläser von Drittanbietern, um ein Beispiel zu geben:
public static convolveop getgaussianblurfilter (int radius, boolean horizontal) {if (Radius <1) {neue IllegalArgumentException ("Radius muss> = 1"); } int size = radius * 2 + 1; float [] data = new Float [Größe]; float sigma = radius / 3.0f; float twIGmasquare = 2.0f * Sigma * Sigma; float sigmaroot = (float) math.sqrt (twosigmasquare * math.pi); Float Total = 0,0F; für (int i = -Radius; i <= radius; i ++) {float distanz = i * i; int index = i + radius; Daten [index] = (float) math.exp (-distanz / twIGmasquare) / Sigmaroot; Gesamt += Daten [Index]; } für (int i = 0; i <data.length; i ++) {data [i] /= total; } Kernel kernel = null; if (horizontal) {kernel = neuer Kernel (Größe, 1, Daten); } else {kernel = neuer Kernel (1, Größe, Daten); } return New Convolveop (Kernel, convolveop.Edge_no_op, null); } public static void SimpleBlur (bufferedImage src, bufferedImage dest) {bufferedImageop op = getgaussianblurfilter (2, false); Op.Filter (SRC, Dest); }Der verwischende Effekt war nach dem Test sehr gut. Darüber hinaus ist es Bildkomprimierung, und es werden keine Werkzeuge von Drittanbietern verwendet, um eine homogene Komprimierung durchzuführen.
public static byte [] from bufufperedImage2 (bufferedImage img, String Imagetype) löscht IoException {bos.reset () aus; // den Autor Iterator <AmageWriter> iter = imageio.getImageWritersByFormatName (ImagType) erhalten; ImageWriter writer = (ImageWriter) iter.next (); // Die Ausgangsparametereinstellungen des angegebenen Schriftstellers (ImageWriteParam) imageWriteParam iwp = writer.getDefaultWriteParam () abrufen; iwp.setCompressionMode (ImageWriteParam.mode_Explicit); // festlegen, ob iWP.SetCompressionQuality (1F) komprimiert werden soll; // Komprimierungsqualitätsparameter iwp.setProgressivemode (ImageWriteParam.mode_Disabled) festlegen; ColorModel colormodel = colormodel.getRGBDefault (); // Geben Sie den Farbmodus an, der während der Komprimierung iwp.setDestinationType verwendet wird (New Javax.imageo.Imagetypespecifier (Colormodel, Colormodel.CreateCompatiblesAmplemodel (16, 16))); Writer.Setoutput (ImageIO .CreateimageOutputStream (BOS)); Iioimage iiamge = new iioimage (IMG, NULL, NULL); writer.write (null, iiamge, iwp); byte [] d = bos.tobytearray (); Rückkehr D; }Zu diesem Zeitpunkt wurde der Codeverarbeitungsprozess des Kerns des Verifizierungscodes für Schieber abgeschlossen. Es gibt viele Details, die kontinuierlich poliert und optimiert werden können, sodass das Gleiterlebnis besser sein kann. Ich hoffe, es kann einigen Schülern helfen, die sich darauf vorbereiten, ihren eigenen Sliding -Verifizierungscode zu erstellen.
Die obigen Code -Implementierungen sind sehr verfeinert. Einerseits ist es leicht zu verstehen, um die Leistung zu gewährleisten, und andererseits ist es leicht zu verstehen. Darüber hinaus ist es aus verschiedenen Gründen nicht bequem, zu viele Details vorzustellen. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Nach dem Testen kann die Prozessantwortzeit der Erzeugung der Schiebetikum mit etwa 20 ms gesteuert werden. Wenn die ursprüngliche Bildauflösung unter 300px*150px liegt, kann er etwa 10 ms erreichen, was sich in einem akzeptablen Bereich befindet. Wenn es einen effizienteren Weg gibt, hoffe ich, mir einige Ratschläge zu geben. Ich hoffe auch, dass jeder wulin.com mehr unterstützen wird.