相关疑难解决方法(0)

OWIN安全 - 如何实施OAuth2刷新令牌

我使用Visual Studio 2013附带的Web Api 2模板有一些OWIN中间件来进行用户身份验证等.

OAuthAuthorizationServerOptions我注意到,OAuth2服务器设置为分发在14天后到期的令牌

 OAuthOptions = new OAuthAuthorizationServerOptions
 {
      TokenEndpointPath = new PathString("/api/token"),
      Provider = new ApplicationOAuthProvider(PublicClientId,UserManagerFactory) ,
      AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
      AllowInsecureHttp = true
 };
Run Code Online (Sandbox Code Playgroud)

这不适合我的最新项目.我想分发可以使用a刷新的短暂bearer_tokensrefresh_token

我做了很多谷歌搜索,找不到任何有用的东西.

所以这就是我设法得到的.我现在已经达到了"WTF do I now"的地步.

我写了一个根据类的属性RefreshTokenProvider实现:IAuthenticationTokenProviderRefreshTokenProviderOAuthAuthorizationServerOptions

    public class SimpleRefreshTokenProvider : IAuthenticationTokenProvider
    {
       private static ConcurrentDictionary<string, AuthenticationTicket> _refreshTokens = new ConcurrentDictionary<string, AuthenticationTicket>();

        public async Task CreateAsync(AuthenticationTokenCreateContext context)
        {
            var guid = Guid.NewGuid().ToString();


            _refreshTokens.TryAdd(guid, context.Ticket);

            // hash??
            context.SetToken(guid);
        }

        public async Task …
Run Code Online (Sandbox Code Playgroud)

c# oauth-2.0 asp.net-web-api owin asp.net-identity

76
推荐指数
3
解决办法
11万
查看次数

生成API密钥的最佳方法

因此,现在有很多不同的服务,谷歌API,Twitter API,Facebook API等.

每个服务都有一个API密钥,如:

AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q

所有密钥的长度和它们包含的字符各不相同,我想知道生成API密钥的最佳方法是什么?

我不是要求特定的语言,只是创建密钥的一般方法,它们是用户应用程序的详细信息加密,哈希,或随机字符串的哈希等等.我们应该担心哈希算法(MSD,SHA1,bcrypt)等?

编辑: 我已经和一些朋友(电子邮件/推特)进行了交谈,他们建议只使用带有短划线的GUID.

这对我来说似乎有些惹人注意,希望能得到更多的想法.

security api-key

64
推荐指数
5
解决办法
4万
查看次数

System.Guid.NewGuid()是如何随机的?(拿两个)

在您开始将其标记为重复之前,请将我读出来.另一个问题是(很可能)不正确的接受答案.

我不知道.NET如何生成其GUID,可能只有微软这样做,但它很有可能只是调用CoCreateGuid().但是,该函数被记录为调用UuidCreate().并且用于创建UUID的算法已被很好地记录.

长话短说,尽管如此,似乎System.Guid.NewGuid()确实使用了版本4 UUID生成算法,因为它生成的所有GUID都符合标准(参见自己,我尝试了几百万个GUID,它们都匹配).

换句话说,除了一些已知位之外,这些GUID 几乎是随机的.

这再次提出了一个问题 - 随机如何随机的?正如每个优秀的小程序员都知道的那样,伪随机数算法只与其种子(即熵)一样随机.那么种子是UuidCreate()什么?PRNG如何重新播种?它是加密强大的,或者如果两台计算机同时意外呼叫System.Guid.NewGuid(),我可以期望相同的GUID开始倾泻吗?如果收集到足够多的顺序生成的GUID,是否可以猜测PRNG的状态?

补充:为了澄清,我想知道我可以信任的随机性因此 - 我在哪里可以使用它.那么,让我们在这里建立一个粗略的"随机性"量表:

  1. 基本随机性,以当前时间为种子.可以在纸牌中使用洗牌,但是即使没有尝试也很容易碰到碰撞.
  2. 更高级的随机性,不仅使用时间,还使用其他机器特定的种子因子.也许在系统启动时也只播种一次.这可用于在DB中生成ID,因为不太可能重复.尽管如此,它对安全性并不好,因为可以用足够的努力预测结果.
  3. 密码随机,使用设备噪声或其他先进的种子随机源.每次调用或至少经常重新播种.可用于会话ID,分发给不受信任的各方等.

我在想到是否可以将它们用作数据库ID时,以及Guid.comb算法的实现System.Guid.NewGuid()(如NHibernate的实现方式)是否有缺陷,我就来到了这个问题.

.net random guid

43
推荐指数
4
解决办法
1万
查看次数

在C#中生成一个强密码?

我想知道如何在C#中生成一个强大而安全的密码.

我用谷歌搜索了一下,在维基百科中看到了这个公式,L密码的长度在哪里,是N可能的符号数:

替代文字

此外,我发现了这个问题,但由于某种原因,该方法Membership.GeneratePassword只返回一个1位数的随机数,绝对没有密码.所有其余的解决方案都很慢(> = 0.5秒).

我需要帮助实现这个公式(我不知道从哪里开始).您也可以建议另一种解决方案或解释为什么GeneratePassword不起作用.

.net c# passwords

29
推荐指数
4
解决办法
3万
查看次数

如何有效地在Java中生成安全的随机字母数字字符串?

如何有效地在Java中生成安全的随机(或伪随机)字母数字字符串?

java security algorithm performance

18
推荐指数
5
解决办法
3万
查看次数

UuidCreate是否使用CSPRNG?

请注意,这不是我的应用程序,它是我正在为客户端测试的应用程序.我通常会在https://security.stackexchange.com/上提出这样的问题,但是因为这是我在这里提出的更多编程相关问题.

当然,UUID的RFC 4122没有规定必须由密码安全伪随机数发生器(CSPRNG)生成类型4 UUID.它简单地说

将所有其他位设置为随机(或伪随机)选择的值.

虽然,算法的某些实现(例如Java中的这种实现)确实使用CSPRNG.

我试图深入研究微软的实施是否成功.主要围绕.NET或MSSQL Server如何生成它们.

检查.NET源代码,我们可以看到以下代码:

 Marshal.ThrowExceptionForHR(Win32Native.CoCreateGuid(out guid), new IntPtr(-1));
 return guid;
Run Code Online (Sandbox Code Playgroud)

检查CoCreateGuiddocco,它说

CoCreateGuid函数调用RPC函数UuidCreate

我能找到关于这个功能的所有内容都在这里.我好像已经到了兔子洞的尽头.

现在,有没有人知道如何UuidCreate生成其UUID?

我见过很多相关帖子:

第一个说:

GUID不保证随机性,它保证了唯一性.如果您想要随机性,请使用Random生成字符串.

我同意这一点,除了在我的情况下随机,不可预测的数字,你当然使用CSPRNG而不是Random(例如RNGCryptoServiceProvider).

而后者的状态(实际上引自维基百科):

WinAPI GUID生成器的密码分析显示,因为V4 GUID的序列是伪随机的; 在完全了解内部状态的情况下,可以预测先前和后续的值

现在,在围栏的另一边,Will Dean说这篇文章

我最后一次研究这个问题(几年前,可能是XP SP2),我直接进入操作系统代码,看看实际发生了什么,并使用安全随机数生成器生成一个随机数.

当然,即使它当前正在使用CSPRNG,这也将是特定于实现的,并且可能随时更改(例如,对Windows的任何更新).不太可能,但理论上可行.

我的观点是,没有规范的参考,以上是为了证明我已经完成了我的研究,上述帖子都没有引用任何权威的内容.

原因是我正在尝试确定是否需要更改使用GUID进行身份验证令牌的系统.从纯粹的设计角度来看,答案肯定是肯定的,但是从实际的角度来看,如果Windows UuidCreate功能确实使用了CSPRNG,那么系统就没有直接的风险.任何人都可以对此有所了解吗?

我正在寻找有信誉的来源的任何答案来支持它.

c# c++ windows security random

16
推荐指数
1
解决办法
1187
查看次数

在C#中生成唯一的*和*随机URL

我的最终目标是创建一个唯一且无法猜测/预测的URL.此URL的目的是允许用户执行验证其电子邮件地址和重置密码等操作.这些URL将在设定的时间内过期(目前设置为24小时).

我最初是Guid为了这个目的而使用的,但我现在明白这是介于"很好"和"非常不安全"之间,取决于你听的专家.所以,我想我会加强我的代码,为了以防万一.起初我以为我只是坚持使用a Guid,但是从随机字节而不是Guid.NewGuid()工厂方法生成它.这是我提出的方法:

public static Guid GetRandomGuid()
{
    var bytes = new byte[16];
    var generator = new RNGCryptoServiceProvider();
    generator.GetBytes(bytes);
    return new Guid(bytes);
}
Run Code Online (Sandbox Code Playgroud)

我不太清楚当你使用new Guid(bytes)而不是Guid.NewGuid(),但是我认为所有这个方法都会生成一个随机字节数组并将其存储Guid数据结构中.换句话说,它不再保证是独一无二的,它只能保证是随机的.

由于我的网址必须既独特随机,这似乎不是一个可靠的解决方案.我现在想,我应该将我的URL基于一个唯一ID(可以是Guid或者,如果可用,数据库自动增加的id)和生成的随机序列的组合RNGCryptoServiceProvider.

问题

什么是生成验证/密码重置URL的最佳方法,该URL既保证唯一又极难/无法预测/猜测?

  • 我应该通过将唯一字符串与随机字符串连接来构建我的URL吗?

  • .NET Framework是否具有内置方法,可以轻松生成可用于URL 的唯一随机(不可预测)的序列?

  • 如果没有,是否有一个很好的解决方案可用开源?

更新

如果有人有类似的要求,我目前正在使用以下方法:

public static string GenerateUniqueRandomToken(int uniqueId)
    // generates a unique, random, and alphanumeric token
{
    const string availableChars =
        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    using (var generator = new …
Run Code Online (Sandbox Code Playgroud)

c# security authentication cryptography guid

10
推荐指数
1
解决办法
5986
查看次数

Microsoft的GUID生成器是否具有加密安全性

我已经在线搜索了多个资源,但到目前为止还无法找到一个明确的答案,即微软的GUID生成机制是否足够安全以保证它可以作为整个应用程序的唯一ID使用.

为了澄清,'足够安全',我的意思是询问用于生成GUID的算法是否具有任何已知的弱点或漏洞,这些弱点或漏洞可能会降低GUID的有效随机性,即导致不可忽略的冲突次数.如果不是,这是否意味着GUID是完全不可行的,如果是,有一些方法可以为GUID生成器函数设定种子,以有效地增加生成的GUID的随机性.

基于在MSDN引导这里(中指定的信息http://msdn.microsoft.com/en-us/library/system.guid.aspx)是没有任何迹象表明用于生成GUID该系统可以在要被依赖足够随机.

谢谢!

.net security cryptography guid

6
推荐指数
2
解决办法
4255
查看次数