Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
HashRequest |
|
| 1.0;1 | ||||
HashRequest$Builder |
|
| 1.0;1 |
1 | /* | |
2 | * Licensed to the Apache Software Foundation (ASF) under one | |
3 | * or more contributor license agreements. See the NOTICE file | |
4 | * distributed with this work for additional information | |
5 | * regarding copyright ownership. The ASF licenses this file | |
6 | * to you under the Apache License, Version 2.0 (the | |
7 | * "License"); you may not use this file except in compliance | |
8 | * with the License. You may obtain a copy of the License at | |
9 | * | |
10 | * http://www.apache.org/licenses/LICENSE-2.0 | |
11 | * | |
12 | * Unless required by applicable law or agreed to in writing, | |
13 | * software distributed under the License is distributed on an | |
14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
15 | * KIND, either express or implied. See the License for the | |
16 | * specific language governing permissions and limitations | |
17 | * under the License. | |
18 | */ | |
19 | package org.apache.shiro.crypto.hash; | |
20 | ||
21 | import org.apache.shiro.util.ByteSource; | |
22 | ||
23 | /** | |
24 | * A {@code HashRequest} is composed of data that will be used by a {@link HashService} to compute a hash (aka | |
25 | * 'digest'). While you can instantiate a concrete {@code HashRequest} class directly, most will find using the | |
26 | * {@link HashRequest.Builder} more convenient. | |
27 | * | |
28 | * @see HashRequest.Builder | |
29 | * @since 1.2 | |
30 | */ | |
31 | public interface HashRequest { | |
32 | ||
33 | /** | |
34 | * Returns the source data that will be hashed by a {@link HashService}. For example, this might be a | |
35 | * {@code ByteSource} representation of a password, or file, etc. | |
36 | * | |
37 | * @return the source data that will be hashed by a {@link HashService}. | |
38 | */ | |
39 | ByteSource getSource(); | |
40 | ||
41 | /** | |
42 | * Returns a salt to be used by the {@link HashService} during hash computation, or {@code null} if no salt is | |
43 | * provided as part of the request. | |
44 | * <p/> | |
45 | * Note that a {@code null} value does not necessarily mean a salt won't be used at all - it just | |
46 | * means that the request didn't include one. The servicing {@link HashService} is free to provide a salting | |
47 | * strategy for a request, even if the request did not specify one. | |
48 | * | |
49 | * @return a salt to be used by the {@link HashService} during hash computation, or {@code null} if no salt is | |
50 | * provided as part of the request. | |
51 | */ | |
52 | ByteSource getSalt(); | |
53 | ||
54 | /** | |
55 | * Returns the number of requested hash iterations to be performed when computing the final {@code Hash} result. | |
56 | * A non-positive (0 or less) indicates that the {@code HashService}'s default iteration configuration should | |
57 | * be used. A positive value overrides the {@code HashService}'s configuration for a single request. | |
58 | * <p/> | |
59 | * Note that a {@code HashService} is free to ignore this number if it determines the number is not sufficient | |
60 | * to meet a desired level of security. | |
61 | * | |
62 | * @return the number of requested hash iterations to be performed when computing the final {@code Hash} result. | |
63 | */ | |
64 | int getIterations(); | |
65 | ||
66 | /** | |
67 | * Returns the name of the hash algorithm the {@code HashService} should use when computing the {@link Hash}, or | |
68 | * {@code null} if the default algorithm configuration of the {@code HashService} should be used. A non-null value | |
69 | * overrides the {@code HashService}'s configuration for a single request. | |
70 | * <p/> | |
71 | * Note that a {@code HashService} is free to ignore this value if it determines that the algorithm is not | |
72 | * sufficient to meet a desired level of security. | |
73 | * | |
74 | * @return the name of the hash algorithm the {@code HashService} should use when computing the {@link Hash}, or | |
75 | * {@code null} if the default algorithm configuration of the {@code HashService} should be used. | |
76 | */ | |
77 | String getAlgorithmName(); | |
78 | ||
79 | /** | |
80 | * A Builder class representing the Builder design pattern for constructing {@link HashRequest} instances. | |
81 | * | |
82 | * @see SimpleHashRequest | |
83 | * @since 1.2 | |
84 | */ | |
85 | public static class Builder { | |
86 | ||
87 | private ByteSource source; | |
88 | private ByteSource salt; | |
89 | private int iterations; | |
90 | private String algorithmName; | |
91 | ||
92 | /** | |
93 | * Default no-arg constructor. | |
94 | */ | |
95 | 32 | public Builder() { |
96 | 32 | this.iterations = 0; |
97 | 32 | } |
98 | ||
99 | /** | |
100 | * Sets the source data that will be hashed by a {@link HashService}. For example, this might be a | |
101 | * {@code ByteSource} representation of a password, or file, etc. | |
102 | * | |
103 | * @param source the source data that will be hashed by a {@link HashService}. | |
104 | * @return this {@code Builder} instance for method chaining. | |
105 | * @see HashRequest#getSource() | |
106 | * @see #setSource(Object) | |
107 | */ | |
108 | public Builder setSource(ByteSource source) { | |
109 | 15 | this.source = source; |
110 | 15 | return this; |
111 | } | |
112 | ||
113 | /** | |
114 | * Sets the source data that will be hashed by a {@link HashService}. | |
115 | * <p/> | |
116 | * This is a convenience alternative to {@link #setSource(ByteSource)}: it will attempt to convert the | |
117 | * argument into a {@link ByteSource} instance using Shiro's default conversion heuristics | |
118 | * (as defined by {@link ByteSource.Util#isCompatible(Object) ByteSource.Util.isCompatible}. If the object | |
119 | * cannot be heuristically converted to a {@code ByteSource}, an {@code IllegalArgumentException} will be | |
120 | * thrown. | |
121 | * | |
122 | * @param source the byte-backed source data that will be hashed by a {@link HashService}. | |
123 | * @return this {@code Builder} instance for method chaining. | |
124 | * @throws IllegalArgumentException if the argument cannot be heuristically converted to a {@link ByteSource} | |
125 | * instance. | |
126 | * @see HashRequest#getSource() | |
127 | * @see #setSource(ByteSource) | |
128 | */ | |
129 | public Builder setSource(Object source) throws IllegalArgumentException { | |
130 | 16 | this.source = ByteSource.Util.bytes(source); |
131 | 16 | return this; |
132 | } | |
133 | ||
134 | /** | |
135 | * Sets a salt to be used by the {@link HashService} during hash computation. | |
136 | * <p/> | |
137 | * <b>NOTE</b>: not calling this method does not necessarily mean a salt won't be used at all - it just | |
138 | * means that the request didn't include a salt. The servicing {@link HashService} is free to provide a salting | |
139 | * strategy for a request, even if the request did not specify one. You can always check the result | |
140 | * {@code Hash} {@link Hash#getSalt() getSalt()} method to see what the actual | |
141 | * salt was (if any), which may or may not match this request salt. | |
142 | * | |
143 | * @param salt a salt to be used by the {@link HashService} during hash computation | |
144 | * @return this {@code Builder} instance for method chaining. | |
145 | * @see HashRequest#getSalt() | |
146 | */ | |
147 | public Builder setSalt(ByteSource salt) { | |
148 | 8 | this.salt = salt; |
149 | 8 | return this; |
150 | } | |
151 | ||
152 | /** | |
153 | * Sets a salt to be used by the {@link HashService} during hash computation. | |
154 | * <p/> | |
155 | * This is a convenience alternative to {@link #setSalt(ByteSource)}: it will attempt to convert the | |
156 | * argument into a {@link ByteSource} instance using Shiro's default conversion heuristics | |
157 | * (as defined by {@link ByteSource.Util#isCompatible(Object) ByteSource.Util.isCompatible}. If the object | |
158 | * cannot be heuristically converted to a {@code ByteSource}, an {@code IllegalArgumentException} will be | |
159 | * thrown. | |
160 | * | |
161 | * @param salt a salt to be used by the {@link HashService} during hash computation. | |
162 | * @return this {@code Builder} instance for method chaining. | |
163 | * @throws IllegalArgumentException if the argument cannot be heuristically converted to a {@link ByteSource} | |
164 | * instance. | |
165 | * @see #setSalt(ByteSource) | |
166 | * @see HashRequest#getSalt() | |
167 | */ | |
168 | public Builder setSalt(Object salt) throws IllegalArgumentException { | |
169 | 3 | this.salt = ByteSource.Util.bytes(salt); |
170 | 3 | return this; |
171 | } | |
172 | ||
173 | /** | |
174 | * Sets the number of requested hash iterations to be performed when computing the final {@code Hash} result. | |
175 | * Not calling this method or setting a non-positive value (0 or less) indicates that the {@code HashService}'s | |
176 | * default iteration configuration should be used. A positive value overrides the {@code HashService}'s | |
177 | * configuration for a single request. | |
178 | * <p/> | |
179 | * Note that a {@code HashService} is free to ignore this number if it determines the number is not sufficient | |
180 | * to meet a desired level of security. You can always check the result | |
181 | * {@code Hash} {@link Hash#getIterations() getIterations()} method to see what the actual | |
182 | * number of iterations was, which may or may not match this request salt. | |
183 | * | |
184 | * @param iterations the number of requested hash iterations to be performed when computing the final | |
185 | * {@code Hash} result. | |
186 | * @return this {@code Builder} instance for method chaining. | |
187 | * @see HashRequest#getIterations() | |
188 | */ | |
189 | public Builder setIterations(int iterations) { | |
190 | 6 | this.iterations = iterations; |
191 | 6 | return this; |
192 | } | |
193 | ||
194 | /** | |
195 | * Sets the name of the hash algorithm the {@code HashService} should use when computing the {@link Hash}. | |
196 | * Not calling this method or setting it to {@code null} indicates the the default algorithm configuration of | |
197 | * the {@code HashService} should be used. A non-null value | |
198 | * overrides the {@code HashService}'s configuration for a single request. | |
199 | * <p/> | |
200 | * Note that a {@code HashService} is free to ignore this value if it determines that the algorithm is not | |
201 | * sufficient to meet a desired level of security. You can always check the result | |
202 | * {@code Hash} {@link Hash#getAlgorithmName() getAlgorithmName()} method to see what the actual | |
203 | * algorithm was, which may or may not match this request salt. | |
204 | * | |
205 | * @param algorithmName the name of the hash algorithm the {@code HashService} should use when computing the | |
206 | * {@link Hash}, or {@code null} if the default algorithm configuration of the | |
207 | * {@code HashService} should be used. | |
208 | * @return this {@code Builder} instance for method chaining. | |
209 | * @see HashRequest#getAlgorithmName() | |
210 | */ | |
211 | public Builder setAlgorithmName(String algorithmName) { | |
212 | 6 | this.algorithmName = algorithmName; |
213 | 6 | return this; |
214 | } | |
215 | ||
216 | /** | |
217 | * Builds a {@link HashRequest} instance reflecting the specified configuration. | |
218 | * | |
219 | * @return a {@link HashRequest} instance reflecting the specified configuration. | |
220 | */ | |
221 | public HashRequest build() { | |
222 | 32 | return new SimpleHashRequest(this.algorithmName, this.source, this.salt, this.iterations); |
223 | } | |
224 | } | |
225 | } |