blob: c3a92fbc06d5ef47ade843b46c43b2155a035913 [file] [log] [blame]
<!DOCTYPE HTML>
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (11.0.11) on Thu Oct 21 16:15:39 EDT 2021 -->
<title>HashService (Apache Shiro 1.8.0 API)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="dc.created" content="2021-10-21">
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../jquery/jquery-ui.css" title="Style">
<script type="text/javascript" src="../../../../../script.js"></script>
<script type="text/javascript" src="../../../../../jquery/jszip/dist/jszip.min.js"></script>
<script type="text/javascript" src="../../../../../jquery/jszip-utils/dist/jszip-utils.min.js"></script>
<!--[if IE]>
<script type="text/javascript" src="../../../../../jquery/jszip-utils/dist/jszip-utils-ie.min.js"></script>
<![endif]-->
<script type="text/javascript" src="../../../../../jquery/jquery-3.5.1.js"></script>
<script type="text/javascript" src="../../../../../jquery/jquery-ui.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="HashService (Apache Shiro 1.8.0 API)";
}
}
catch(err) {
}
//-->
var data = {"i0":6};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
var pathtoroot = "../../../../../";
var useModuleDirectories = true;
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<header role="banner">
<nav role="navigation">
<div class="fixedNav">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a id="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/HashService.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<ul class="navListSearch">
<li><label for="search">SEARCH:</label>
<input type="text" id="search" value="search" disabled="disabled">
<input type="reset" id="reset" value="reset" disabled="disabled">
</li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
</div>
<div class="navPadding">&nbsp;</div>
<script type="text/javascript"><!--
$('.navPadding').css('padding-top', $('.fixedNav').css("height"));
//-->
</script>
</nav>
</header>
<!-- ======== START OF CLASS DATA ======== -->
<main role="main">
<div class="header">
<div class="subTitle"><span class="packageLabelInType">Package</span>&nbsp;<a href="package-summary.html">org.apache.shiro.crypto.hash</a></div>
<h2 title="Interface HashService" class="title">Interface HashService</h2>
</div>
<div class="contentContainer">
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>All Known Subinterfaces:</dt>
<dd><code><a href="ConfigurableHashService.html" title="interface in org.apache.shiro.crypto.hash">ConfigurableHashService</a></code></dd>
</dl>
<dl>
<dt>All Known Implementing Classes:</dt>
<dd><code><a href="DefaultHashService.html" title="class in org.apache.shiro.crypto.hash">DefaultHashService</a></code></dd>
</dl>
<hr>
<pre>public interface <a href="../../../../../src-html/org/apache/shiro/crypto/hash/HashService.html#line.53">HashService</a></pre>
<div class="block">A <code>HashService</code> hashes input sources utilizing a particular hashing strategy.
<p/>
A <code>HashService</code> sits at a higher architectural level than Shiro's simple <a href="Hash.html" title="interface in org.apache.shiro.crypto.hash"><code>Hash</code></a> classes: it allows
for salting and iteration-related strategies to be configured and internalized in a
single component that can be re-used in multiple places in the application.
<p/>
For example, for the most secure hashes, it is highly recommended to use a randomly generated salt, potentially
paired with an configuration-specific private salt, in addition to using multiple hash iterations.
<p/>
While one can do this easily enough using Shiro's <a href="Hash.html" title="interface in org.apache.shiro.crypto.hash"><code>Hash</code></a> implementations directly, this direct approach could
quickly lead to copy-and-paste behavior. For example, consider this logic which might need to repeated in an
application:
<pre>
int numHashIterations = ...
ByteSource privateSalt = ...
ByteSource randomSalt = <a href="../RandomNumberGenerator.html" title="interface in org.apache.shiro.crypto"><code>randomNumberGenerator</code></a>.nextBytes();
ByteSource combined = combine(privateSalt, randomSalt);
Hash hash = Sha512Hash(source, combined, numHashIterations);
save(hash);
</pre>
In this example, often only the input source will change during runtime, while the hashing strategy (how salts
are generated or acquired, how many hash iterations will be performed, etc) usually remain consistent. A HashService
internalizes this logic so the above becomes simply this:
<pre>
HashRequest request = new HashRequest.Builder().source(source).build();
Hash result = hashService.hash(request);
save(result);
</pre></div>
<dl>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>1.2</dd>
</dl>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ========== METHOD SUMMARY =========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t3" class="tableTab"><span><a href="javascript:show(4);">Abstract Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Method</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code><a href="Hash.html" title="interface in org.apache.shiro.crypto.hash">Hash</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#computeHash(org.apache.shiro.crypto.hash.HashRequest)">computeHash</a></span>&#8203;(<a href="HashRequest.html" title="interface in org.apache.shiro.crypto.hash">HashRequest</a>&nbsp;request)</code></th>
<td class="colLast">
<div class="block">Computes a hash based on the given request.</div>
</td>
</tr>
</table>
</li>
</ul>
</section>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ============ METHOD DETAIL ========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a id="computeHash(org.apache.shiro.crypto.hash.HashRequest)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>computeHash</h4>
<pre class="methodSignature"><a href="Hash.html" title="interface in org.apache.shiro.crypto.hash">Hash</a>&nbsp;<a href="../../../../../src-html/org/apache/shiro/crypto/hash/HashService.html#line.76">computeHash</a>&#8203;(<a href="HashRequest.html" title="interface in org.apache.shiro.crypto.hash">HashRequest</a>&nbsp;request)</pre>
<div class="block">Computes a hash based on the given request.
<h3>Salt Notice</h3>
If a salt accompanies the return value
(i.e. <code>returnedHash.<a href="Hash.html#getSalt()"><code>getSalt()</code></a> != null</code>), this
same exact salt <b><em>MUST</em></b> be presented back to the <code>HashService</code> if hash
comparison/verification will be performed at a later time (for example, for password hash or file checksum
comparison).
<p/>
For additional security, the <code>HashService</code>'s internal implementation may use more complex salting
strategies than what would be achieved by computing a <code>Hash</code> manually.
<p/>
In summary, if a <a href="HashService.html" title="interface in org.apache.shiro.crypto.hash"><code>HashService</code></a> returns a salt in a returned Hash, it is expected that the same salt
will be provided to the same <code>HashService</code> instance.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>request</code> - the request to process</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the hashed data</dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="Hash.html#getSalt()"><code>Hash.getSalt()</code></a></dd>
</dl>
</li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
</div>
</main>
<!-- ========= END OF CLASS DATA ========= -->
<footer role="contentinfo">
<nav role="navigation">
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a id="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/HashService.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</nav>
<p class="legalCopy"><small>Copyright &#169; 2004&#x2013;2021 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
</footer>
</body>
</html>