我试图根据sha256使哈希成为密码值.我已经搜索了这个,但没有关于swift 2的信息.这个解决方案对我没用
func sha256(data:String) -> String {
let data = self.dataUsingEncoding(NSUTF8StringEncoding)!
var digest = [UInt8](count:Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA256(data.bytes, CC_LONG(data.length), &digest)
let hexBytes = digest.map { String(format: "%02hhx", $0) }
return hexBytes.joinWithSeparator("")
}
Run Code Online (Sandbox Code Playgroud)
它给出错误:使用未解析的标识符CC_SHA256_DIGEST_LENGTH
我正在尝试使用Apache/Jakarta HttpClient 4.1.1使用给定的凭据连接到任意网页.为了测试这一点,我在运行的dev机器上安装了最少的IIS 7.5,其中一次只有一种身份验证模式处于活动状态.基本身份验证工作正常,但每当我尝试登录时,Digest和NTLM都会返回401错误消息.这是我的代码:
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpget = new HttpGet("http://localhost/");
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(AuthScope.ANY,
new NTCredentials("user", "password", "", "localhost"));
if (!new File(System.getenv("windir") + "\\krb5.ini").exists()) {
List<String> authtypes = new ArrayList<String>();
authtypes.add(AuthPolicy.NTLM);
authtypes.add(AuthPolicy.DIGEST);
authtypes.add(AuthPolicy.BASIC);
httpclient.getParams().setParameter(AuthPNames.PROXY_AUTH_PREF,
authtypes);
httpclient.getParams().setParameter(AuthPNames.TARGET_AUTH_PREF,
authtypes);
}
localContext.setAttribute(ClientContext.CREDS_PROVIDER, credsProvider);
HttpResponse response = httpclient.execute(httpget, localContext);
System.out.println("Response code: " + response.getStatusLine());
Run Code Online (Sandbox Code Playgroud)
我在Fiddler中注意到的一件事是Firefox和HttpClient发送的哈希值不同,这让我觉得IIS 7.5可能比HttpClient提供更强的哈希值?有任何想法吗?如果我能够验证这适用于NTLM,那就太棒了.摘要也会很好,但如果有必要,我可以不用它.
Google App脚本函数computeDigest返回签名的字节数组.如何获取摘要的字符串表示?
我已经尝试过bin2String()函数.
function sign(){
var signature = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "thisisteststring")
Logger.log(bin2String(signature));
}
function bin2String(array) {
var result = "";
for (var i = 0; i < array.length; i++) {
result += String.fromCharCode(parseInt(array[i], 2));
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
但它把""放在日志中
我在生产中遇到资产问题.
我无法加载样式表,javascripts甚至图像.
当我尝试访问某些内容时,它会显示错误 - 未找到但是当我尝试使用-digest访问时,它没问题.
我有资产预编译,通过capistrano成功部署manifest - > assets_manifest.json
谢谢
日志:样式表错误(样式表加载了themes_for_rails gem)当我尝试访问/assets/default/stylesheets/application-ec9a310f792c60f2f77810cfcd9b903f.css时,一切正常
I, [2013-07-17T14:38:45.120183 #31938] INFO -- : Started GET "/assets/default/stylesheets/application.css?locale=cs" for 90.181.17.25 at 2013-07-17 14:38:45 +0200
I, [2013-07-17T14:38:45.123007 #31938] INFO -- : Processing by ThemesForRails::AssetsController#stylesheets as CSS
I, [2013-07-17T14:38:45.123429 #31938] INFO -- : Parameters: {"locale"=>"cs", "theme"=>"navarsi", "asset"=>"application"}
I, [2013-07-17T14:38:45.124912 #31938] INFO -- : Rendered text template (0.0ms)
I, [2013-07-17T14:38:45.125177 #31938] INFO -- : Completed 404 Not Found in 2ms (Views: 0.5ms | ActiveRecord: 0.0ms)
Run Code Online (Sandbox Code Playgroud)
图像日志错误:
ActionController::RoutingError (No route matches …Run Code Online (Sandbox Code Playgroud) 我一直在查看摘要认证示例:
http://hc.apache.org/httpcomponents-client-4.3.x/examples.html
在我的场景中,有几个线程发出HTTP请求,并且每个线程都必须使用自己的一组凭据进行身份验证.另外,请考虑这个问题可能非常具体针对Apache HTTP客户端4.3以上,4.2可能以不同的方式处理身份验证,尽管我自己没有检查它.也就是说,实际问题就出现了.
我想只使用一个客户端实例(该类的静态成员,即线程安全)并为其提供连接管理器以支持多个并发请求.关键是每个请求都会提供不同的凭据,我没有看到为每个请求分配凭据的方法,因为在构建http客户端时设置了凭据提供程序.从上面的链接:
[...]
HttpHost targetHost = new HttpHost("localhost", 80, "http");
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope(targetHost.getHostName(), targetHost.getPort()),
new UsernamePasswordCredentials("username", "password"));
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider).build();
Run Code Online (Sandbox Code Playgroud)
[...]
检查:
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html#d5e600
第4.4点(寻求4.4.HTTP认证和执行上下文)中的代码示例似乎表示HttpClientContext被赋予auth高速缓存和凭证提供者,然后被传递给HTTP请求.在它旁边执行请求,似乎客户端将在HTTP请求中获得主机的凭据过滤.换句话说:如果上下文(或缓存)具有当前HTTP请求的目标主机的有效凭据,则他将使用它们.对我来说问题是不同的线程将对同一主机执行不同的请求.
有没有办法为每个HTTP请求提供自定义凭据?
在此先感谢您的时间!:)
http credentials digest apache-httpcomponents apache-httpclient-4.x
我在glassfish v3.0.1 b22中使用jdbcRealm来保证安全性.它被设置为使用我的数据库中的USER表进行身份验证,方法是访问以下博客:http://blogs.oracle.com/foo/entry/mort_learns_jdbc_realm_authentication.如果我将摘要算法保留为纯文本,我的工作正常.但是,当我尝试使用SHA-256进行摘要算法时,它会停止工作.我所做的是在Glassfish中指定 - 安全 - 领域 - jdbcRealm - 我想要SHA-256的摘要(我只是在摘要字段中键入SHA-256).然后我写了一个简单的Java程序,将密码文本转换为SHA-256哈希.然后我将该哈希粘贴到数据库中的密码字段中.顺便说一句,密码字段是类型varchar(30).我不能再登录了.有一点我注意到我的简单Java程序每次为同一文本字段生成不同的哈希值.
下面是我简单的java程序:
MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "admin";
md.update(text.getBytes("UTF-8"));
byte[] digest = md.digest();
System.out.println(digest.toString());
Run Code Online (Sandbox Code Playgroud) 所以我决定对我的REST API使用摘要HTTP身份验证.我用Google搜索并在PHP手册中找到了一个条目,其中有一个如何操作的示例.所以我复制脚本,将它放在我的服务器上的index.php中,在浏览器中打开页面,在输入我的凭据后,浏览器再次询问它们,我陷入无限循环的输入凭据.该脚本包含在下面,可以在这里找到.
示例#7摘要HTTP身份验证示例
<?php
$realm = 'Restricted area';
//user => password
$users = array('admin' => 'mypass', 'guest' => 'guest');
if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Digest realm="'.$realm.
'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');
die('Text to send if user hits Cancel button');
}
// analyze the PHP_AUTH_DIGEST variable
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
!isset($users[$data['username']]))
die('Wrong Credentials!');
// generate the valid response
$A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);
if ($data['response'] != $valid_response)
die('Wrong …Run Code Online (Sandbox Code Playgroud) 我希望能够获取任意字符串,通过散列函数(如MD5)运行它,然后在base-36中解释生成的摘要.
我知道在Ruby中已经存在一个Digest库,但据我所知,我无法得到摘要的原始字节; 该to_s函数被映射到hexdigest,当然,它是base-16.
我有一个文件的MD5十六进制摘要的字符串表示,我想转换为base64,以便在上传时使用Content-MD5 HTTP标头.是否有比以下更清晰或更有效的机制?
def hex_to_base64_digest(hexdigest)
[[hexdigest].pack("H*")].pack("m").strip
end
hex_digest = "65a8e27d8879283831b664bd8b7f0ad4"
expected_base64_digest = "ZajifYh5KDgxtmS9i38K1A=="
raise "Does not match" unless hex_to_base64_digest(hex_digest) === expected_base64_digest
Run Code Online (Sandbox Code Playgroud) 我将解释到目前为止我所做的所有步骤,并以我的问题结束.
使用OpenSSL 1.0.1e-fips 2013年2月11日
生成私钥和公钥
openssl genrsa -des3 -out private.pem 2048
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
Run Code Online (Sandbox Code Playgroud)
使用摘要和私钥签名消息
openssl dgst -sha256 -sign private.pem -out message.secret message.txt
Run Code Online (Sandbox Code Playgroud)
在这一点上,我有一个公钥,一个签名的消息(带摘要)和原始消息.
第1部分 - 使用CLI(这个工作)
使用CLI我设法验证摘要:
openssl dgst -sha256 -verify public.pem -signature message.secret message.txt
Run Code Online (Sandbox Code Playgroud)
我将"已验证"作为返回值.
第2部分 - 使用C程序
我的程序看起来像这样:
哪里:
msg是message.txt
签名是message.secret
pkey是公钥(使用PEM_read_PUBKEY实现)
int verify_it(const byte* msg, size_t msg_len, byte* signature, EVP_PKEY* pkey) {
EVP_MD_CTX *ctx;
size_t sig_len;
int bool_ret;
int ret_val;
ret_val = EXIT_SUCCESS;
ctx = NULL;
do
{
ctx = …Run Code Online (Sandbox Code Playgroud)