/* * ARX: Powerful Data Anonymization * Copyright 2012 - 2017 Fabian Prasser, Florian Kohlmayer and contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.deidentifier.arx; import java.io.Serializable; /** * Basic configuration of monetary amounts, such as the publisher's benefit * per record or the per-record fine fine for a successful re-identification attack. * These parameters can be used to perform monetary cost/benefit analyses, e.g. * using a game-theoretic approach. * * @author Fabian Prasser */ public class ARXCostBenefitConfiguration implements Serializable { /** SVUID*/ private static final long serialVersionUID = -560679186676701860L; /** * Creates a new instance * @return */ public static ARXCostBenefitConfiguration create() { return new ARXCostBenefitConfiguration(); } /** Basic parameters */ private double publisherBenefit = 1200d; /** Basic parameters */ private double publisherLoss = 300d; /** Basic parameters */ private double adversaryGain = 300d; /** Basic parameters */ private double adversaryCost = 4d; /** * Hide constructor */ protected ARXCostBenefitConfiguration() { // Empty by design } @Override public ARXCostBenefitConfiguration clone() { ARXCostBenefitConfiguration result = new ARXCostBenefitConfiguration(); result.publisherBenefit = this.publisherBenefit; result.publisherLoss = this.publisherLoss; result.adversaryGain = this.adversaryGain; result.adversaryCost = this.adversaryCost; return result; } /** * Returns the amount of money needed by an attacker for trying to re-identify a single record * @return the adversaryCost */ public double getAdversaryCost() { return adversaryCost; } /** * Returns the amount of money earned by an attacker for successfully re-identifying a single record * @return the adversaryGain */ public double getAdversaryGain() { return adversaryGain; } /** * Returns the amount of money earned by the data publisher for publishing a single record * @return the publisherBenefit */ public double getPublisherBenefit() { return publisherBenefit; } /** * Returns the amount of money lost by the data publisher, e.g. due to a fine, if a single record is attacked successfully * @return the publisherLoss */ public double getPublisherLoss() { return publisherLoss; } /** * Sets the amount of money needed by an attacker for trying to re-identify a single record * @param adversaryCost the adversaryCost to set */ public ARXCostBenefitConfiguration setAdversaryCost(double adversaryCost) { checkParameter("adversary cost", adversaryCost); this.adversaryCost = adversaryCost; return this; } /** * Sets the amount of money earned by an attacker for successfully re-identifying a single record * @param adversaryGain the adversaryGain to set */ public ARXCostBenefitConfiguration setAdversaryGain(double adversaryGain) { checkParameter("adversary gain", adversaryGain); this.adversaryGain = adversaryGain; return this; } /** * Sets the amount of money earned by the data publisher for publishing a single record * @param publisherBenefit the publisherBenefit to set */ public ARXCostBenefitConfiguration setPublisherBenefit(double publisherBenefit) { checkParameter("publisher benefit", publisherBenefit); this.publisherBenefit = publisherBenefit; return this; } /** * Sets the amount of money lost by the data publisher, e.g. due to a fine, if a single record is attacked successfully * @param publisherLoss the publisherLoss to set */ public ARXCostBenefitConfiguration setPublisherLoss(double publisherLoss) { checkParameter("publisher loss", publisherLoss); this.publisherLoss = publisherLoss; return this; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("[benefit=").append(publisherBenefit).append(", loss="); builder.append(publisherLoss).append(", gain=").append(adversaryGain).append(", cost=").append(adversaryCost).append("]"); return builder.toString(); } /** * Checks a given parameter * @param parameter * @param value */ private void checkParameter(String parameter, double value) { if (value < 0d || Double.isNaN(value) || Double.isInfinite(value)) { throw new IllegalArgumentException("Parameter '" + parameter + "' out of range!"); } } }